Swift 3のエラー処理の概要

今日、私たちは、Swiftプログラミング言語のドキュメントの学習中に、「エラー処理」の章を避けながら、記事の著者と同じように翻訳を準備しました。

記事から学ぶことができます




私の話

私が若かったとき、私はスウィフト言語のドキュメントを勉強し始めました。 「エラー処理」を除いて、すべての章を何度も読みました。 何らかの理由で、この章を理解するにはプロのプログラマーである必要があるように思えました。

エラー処理が怖かった。 catch、try、throw、およびthrowsのような言葉は無意味に思えました。 彼らはただ怖かった。 彼らは彼らを初めて見た人を怖がらせて見えませんか? しかし、心配しないでください、私の友人たち。 私はあなたを助けるためにここにいます。

13歳の妹に説明したように、エラー処理は、if-elseブロックを記述してエラーメッセージを送信するもう1つの方法です。

テスラモーターズからのエラーメッセージ

ご存知のように、テスラ車には自動操縦機能があります。 ただし、何らかの理由でマシンがクラッシュした場合は、ハンドルを拾うように求められ、エラーが報告されます。 このチュートリアルでは、エラー処理を使用してこのようなメッセージを表示する方法を学習します。

道路上の信号機などのオブジェクトを認識するプログラムを作成します。 これを行うには、少なくとも機械学習、ベクトル計算、線形代数、確率理論、離散数学を知っている必要があります。 冗談。

if-elseステートメントの紹介

Hand Swiftのエラー処理を最大限に活用するために、振り返ってみましょう。 エラーメッセージに直面したときに、すべてではないにしても多くの初心者開発者が行うことは次のとおりです。

var isInControl = true func selfDrive() { if isInControl { print("You good, let me ride this car for ya") } else { print("Hold the handlebar RIGHT NOW, or you gone die") } } selfDrive() // "You good..." 

問題

最大の問題は、elseブロックが面倒になったときのコードの可読性です。 まず、関数を最初から最後まで読むか、関数を呼び出すまで関数自体にエラーメッセージが含まれているかどうか、たとえばselfDriveCanCauseErrorが機能するかどうかがわかりません。

参照してください、関数はドライバーを殺すことができます。 この機能は危険であり、注意を払わないと致命的になる可能性があることをチームに明示的に警告する必要があります。

elseブロック内でいくつかの複雑な機能またはアクションを実行すると、別の問題が発生する場合があります。 例:

 else { print("Hold the handle bar Right now...") // If handle not held within 5 seconds, car will shut down // Slow down the car // More code ... // More code ... } 

elseブロックは膨らんでいて、それを使って作業するのは、冬服でバスケットボールをしようとするようなものです(実際、韓国ではかなり寒いので、そうします)。 私の言うことを理解していますか? くて読めません。

したがって、直接呼び出しの代わりにelseブロックに関数を追加するだけで済みます。

 else { slowDownTheCar() shutDownTheEngine() } 

ただし、同時に、強調した最初の問題が残っています。さらに、selfDrive()関数が危険であり、注意して処理する必要があることを示す明確な方法はありません。 したがって、エラー処理に飛び込んで、モジュール式で正確なエラーメッセージを作成することをお勧めします。

エラー処理の紹介

これまでに、エラーメッセージに関するIf-elseの問題について既に知っています。 上記の例は単純すぎました。 2つのエラーメッセージがあると仮定します。

  1. あなたは迷子になりました
  2. 車のバッテリーが残り少なくなっています。

エラープロトコルに準拠する列挙型を作成します。

 enum TeslaError: Error { case lostGPS case lowBattery } 

正直なところ、Errorプロトコルが何をするのか正確にはわかりませんが、エラー処理なしではできません。 「ボタンを押すとラップトップの電源が入るのはなぜですか? スワイプして電話画面のロックを解除できるのはなぜですか?」

Swift開発者はそのように決定したので、私は彼らの動機について疑問に思いたくありません。 私は彼らが私たちのためにしたことを使うだけです。 もちろん、より詳細に理解したい場合は、Swiftプログラムコードをダウンロードして自分で分析することができます。つまり、私たちの類推でラップトップまたはiPhoneを分解します。 この手順はスキップします。

混乱している場合は、さらにいくつかの段落を容認してください。 TeslaErrorが関数になると、すべてが明らかになることがわかります。

最初に、エラー処理を使用せずにエラーメッセージを送信しましょう。

 var lostGPS: Bool = true var lowBattery: Bool = false func autoDriveTesla() { if lostGPS { print("I'm lost, bruh. Hold me tight") // A lot more code } if lowBattery { print("HURRY! ") // Loads of code } } 

したがって、これを実行した場合:

 autoDriveTesla() // "HURRY! " 

しかし、エラー処理を使用しましょう。 まず、関数が危険であり、エラーをスローする可能性があることを明示的に示す必要があります。 関数にthrowsキーワードを追加します。

 func autoDriveTesla() throws { ... } 

この機能は、autoDriveTeslaは特別なケースであり、ブロック全体を読む必要がないことをチームメートに自動的に伝えます。

いいですね? さて、ドライバーがElse-Ifブロック内でlostGPAまたはlowBatteryに遭遇したときに、これらのエラーをスローする時間です。 列挙型TeslaErrorを覚えていますか?

 func autoDriveTesla() throws { if lostGPS { throw TeslaError.lostGPS } if lowBattery { throw TeslaError.lowBattery } 

私はあなたをすべてキャッチします

lostGPSがtrueの場合、関数はTeslaError.lostGPSを送信します。 しかし、その後何をすべきか? このエラーメッセージをどこに挿入し、elseブロックのコードを追加しますか?

 print("Bruh, I'm lost. Hold me tight") 

さて、情報に圧倒されたくないので、throwsキーワードがあるときに関数を実行する方法から始めましょう。

これは特殊なケースであるため、この関数を使用するときはdoブロック内にtryを追加する必要があります。 あなたは:「何?」。 もう少し私の考えに従ってください。

 do { try autoDriveTesla() } 

あなたが今考えていることはわかっています。「画面にエラーメッセージを表示したいのです。そうしないと、ドライバーが死んでしまいます。」

それでは、このエラーメッセージはどこに配置しますか? この関数は2つのエラーメッセージを送信できることがわかっています。

  1. TeslaError.lowBattery
  2. TeslaError.lostGPS。

関数がエラーを生成したら、それを「キャッチ」し、これを行うとすぐに、対応するメッセージを画面に表示する必要があります。 少しわかりにくいので、見てみましょう。

 var lostGPS: Bool = false var lowBattery: Bool = true do { try autoDriveTesla() } catch TeslaError.lostGPS { print("Bruh, I'm lost. Hold me tight") } catch TeslaError.lowBattery { print("HURRY! ") } } // Results: "HURRY! " 

これですべてが明確になります。 すべてが明確でない場合は、いつでもYouTubeで私のビデオを見ることができます

Initでのエラー処理

エラー処理は、関数だけでなく、オブジェクトを初期化する必要がある場合にも適用できます。 コース名を指定しなかった場合、エラーを出す必要があるとします。



tryUdemyCourse(名前: "")を入力すると、エラーメッセージが表示されます。

Try!を使用する場合 してみて?

いいね tryは、do-catchブロック内で関数/初期化を実行する場合にのみ使用されます。 ただし、エラーメッセージを画面に表示して何が起こっているかをユーザーに警告する、または何らかの方法で修正するという目標がない場合、catchブロックは必要ありません。

試しますか?-それは何ですか?

始めましょうか? 推奨されていませんが、

 let newCourse = try? UdemyCourse("Functional Programming") 

試しますか? 常にオプションのオブジェクトを返すため、newCourseを抽出する必要があります

 if let newCourse = newCourse { ... } 

initメソッドが次のようなエラーをスローした場合

 let myCourse = try? UdemyCourse("") // throw NameError.noName 

myCourseはゼロになります。

やってみて! -それは何ですか?

トライとは違いますか? オプションの値ではなく、通常の値を返します。 例えば

 let bobCourse = try! UdemyCourse("Practical POP") 

bobCourseはオプションではありません。 ただし、初期化メソッドが次のようなエラーを生成する場合、

 let noCourseName = try! UdemyCourse("") // throw NameError.noName 

その後、アプリケーションがクラッシュします。 を使用した強制抽出と同様に、何が起こっているのかが101%確実でない限り、絶対に使用しないでください。

まあ、それだけです。 これで、エラー処理の概念を理解できました。 簡単でシンプル! そして、プロのプログラマーになる必要はありません。

Source: https://habr.com/ru/post/J320940/


All Articles