2016-04-05 26 views
5

次のことを述べてSwift Docsでノートがあります:スウィフトの取り扱いSwiftとObj-Cの例外。スタック巻き戻しとは何ですか?なぜスウィフトはそれをしないのですか?

エラーは、キーワードをキャッチし、投げる、トライを使用して、他の言語での例外処理に似ています。 SwiftでのObjective-Cエラーハンドリングを含む多くの言語での例外処理とは異なり、計算コストがかかるプロセスであるコールスタックの巻き戻しは必要ありません。したがって、throwステートメントのパフォーマンス特性はreturnステートメントのパフォーマンス特性に匹敵します。

SwiftとObj-cのコールスタックの解き放つ意味は? Related question hereですが、C++固有です。私はコールスタックが何であるかは知っていますが、巻き戻しの詳細な説明が必要です。

Swiftが呼び出しスタックを巻き戻さない場合、代わりに何をしますか?

これは計算上高価なのはなぜですか?

合計要約:Swiftの例外処理と実行フローをよりよく理解したいと思います。

答えて

2

スタックの巻き戻しとは、例外がスローされるとすぐにメソッドが中断され、メソッドの呼び出し側がすぐに中断され、例外ハンドラ(try-catch-finally)が見つかるか、例外が通常は現在のスレッドを中断して終了するときにスタックを返します。

ガベージコレクタを使用する言語ではうまく動作しますが、一般的に手動メモリ管理の言語ではメモリリークが発生する可能性があります。また、メソッドが予期しない場所で中断されるため、例外はしばしば未定義/回復不可能なプログラム状態につながります。

これは、すべての言語の例外を控えめに使用し、通常のプログラムフローを処理するのではなく、例外的な状況を処理する場合にのみ使用する必要がある理由です。

Obj-C例外は、上記のすべての問題(NSException,を参照)があまり良くないため、誰も使用していません。 Obj-Cにはエラーパラメータが付属しています(NSError変数への参照を渡します。メソッドが失敗した場合は、その変数にエラーが割り当てられます)。 Error Handling in Objective-C

SwiftにはNSErrorの別の構文が付属しています。実際の例外処理ではありません(エラーはプログラムの実行を中断しません)。 Error Handling in Swift

技術的には、Swiftでエラーを発生させる可能性のあるすべての関数/メソッドには、呼び出し元コンテキストにエラーを戻すための追加の隠しパラメータしかありません。

詳細情報が必要な場合は、Swift 1.xと2.xのコードを比較するだけです(1.xはエラー処理のための特別な文法はまだありません)。

+2

私が決して得られなかったもの:関数から戻ってくる*巻き戻しをスタックする*。もちろん、ステップバイステップ(別名コールバイコ​​ール)。しかし、なぜこれが安価であるのかわかりません。 –

+0

@ AminNegm-Awad実際に性能を測定することは容易ではありません。すべての言語とすべてのコンパイラはわずかに異なるモデルを使用します。例えば、http://stackoverflow.com/questions/13835817/are-exceptions-in-c-really-slowを見ることができます。例外が実際に発生した場合、パフォーマンスへの影響は重要であることに注意してください。通常のプログラムフローに例外を使用しないもう一つの理由。また、例外をまったく使用しないプログラミング言語は、コンパイラによってさらに最適化され、より優れたパフォーマンスにつながります。 – Sulthan

+2

@Sulthanあなたの答えはおかげさまで助けになりましたが、Swiftには、それが返すことができる隠されたparamがあります。これはスタックの巻き戻しとはどう違うのでしょうか? func two()を呼び出すfunc one()を呼び出すと、2つのハンドルのどちらも例外をスローして2つの例外がスローされます。しかし、two()を呼び出す呼び出し後の文は実行されません。スタックを呼び出し側に巻き戻すのではないですか?その後、catchブロック内の呼び出し元の次のステートメントから実行が続行されます。 – Brynjar

関連する問題