回答:
例外は、例外処理を許可するために存在します。これにより、クラッシュを回避できますが、より一般的には、望ましくないまたは予測できないシステム動作を防止できます。たとえば、データベースへのプログラムの接続がタイムアウトした場合、通常システムはクラッシュしませんが、データベースのデータに依存している場合、例外によりこのデータのない状況を通常とは異なる方法で処理できます。
デフォルトでは、私のプログラムはデータベースから返されたものに基づいてデータのページを表示するとします。混乱したビューを提示したり、潜在的に無効な操作を続ける代わりに、この例外をキャッチして別のデータベースにフォールバックし、ローカルデータから読み取り、ユーザーにデータを要求するか、ユーザーまたはシステムを安全な状態(おそらく1つ)に戻すことができますそれはすぐに同じ例外を引き起こしません!)
さらに、ユーザー入力が問題の原因/解決策になる可能性のあるシステムでは、例外により、問題に関する詳細で役立つ情報をユーザーに知らせることができます。あまりにも一般的な「...で未処理の例外が発生しました」または「SQLから直接エラーメッセージを脅迫する」の代わりに、「リソースBに接続できませんでした」などの役立つまたは少なくとも理解できることをユーザーに伝えることができます。
エラー処理を簡素化するために、例外が作成されました。例外なく、エラー処理ロジックをアプリケーション全体に分散させる必要があります。エラーになる可能性のある関数は、何らかの理由でエラーステータスを返す必要があり、各呼び出しの後にエラーチェックが必要です。多くの場合、呼び出し元はエラーの場合に有用なことは何もできず、エラーのみを返すことができます。アプリケーションコードの半分はエラー処理専用です。このようなコードは非常に脆弱です。エラーチェックとクラッシュを除外するのは非常に簡単です。さらに悪いことに、気付かないエラーのために誤った結果を返すこともあります。
例外を除いて、エラーは処理できる時点でのみチェックできます。関数は使用可能な値を返すか、例外をスローするため、ほとんどのアプリケーションコードは直線的に記述することができます。
例外のポイントは、例外的な状況をユーザーに知らせることです。システムで何か問題が発生した場合、プログラムはそれを認識し、*適切に処理できるようにする必要があります。
ただし、システムが「クラッシュ」するのを防ぐための例外はありません。例外は、問題があることを知らせてくれます。私がどのように進むかによって、システムが「クラッシュ」するかどうかを判断できます。
また、あなたが言ったように、例外はアプリケーションを終了する必要がないことに注意してください。プログラマは例外を処理し、修正するか、ユーザーにとって意味のあるエラーに変えることができます。
*チェックされた例外(強制的にキャッチされる例外)の使用は、少し痛い所です。一部の(おそらくほとんどの)開発者は、強制的な例外処理が面倒で、不必要で、単に悪い習慣であることに気付きます。
例外は、エラーハンドラーからエラーの場所を分割することにより、最新のエラー処理を可能にします。これはフロー制御にも使用されることがあります。
未処理の例外はプログラムを終了します。しかし、これらは前の例外と違いはありません。すべてのパスに適切なエラーハンドラーを含めるのを忘れた怠programmerなプログラマーが、エンドユーザーにそれらを表示させます。他の予期しない終了と同じように、プログラムが例外によりクラッシュしたと考えます。
OSはクラッシュするプロセスに関係なく、クラッシュしたプロセスをクリーンアップするのに非常に優れているため、誤動作しているプロセスを終了してリソースを解放する以外に、例外によってOSの安全性が増すことはありません。
とても簡単です。
例外が発明される前に、すべての関数は終了コード(エラー/成功)を返す必要があり、関数が設定するメモリへのポインターを渡すことにより、関数からの結果または出力を取得する必要がありました。
問題は、多くのプログラマーがすべての機能について誤った終了コードをチェックすることを覚えておらず、そのために致命的なエラーが無視されることがあり、まったく説明できない動作につながることでした。
したがって、それは決定されました-あなたが考慮しなかったエラーが発生すると、すぐにクラッシュします!別名例外処理。
エラー処理フロー(プログラムが例外的な状況から回復しようとする方法)から通常のプログラムフロー(プログラムが実行するように設計されていること)を分離する例外が存在します。
これにより、コードがより明確になり、保守が容易になります。
2つのコードスニペットを検討します。
try:
do1() # this is obvoiusly a normal
do2() # program flow
except:
oups() # this is exception handling code
これと比較して:
if foo():
thing1() # is this part of normal program flow?
else:
thing2() # or maybe this one? Or both? When?
もちろん、例外処理を使用して、プログラムがクラッシュするのを防ぐことができます。
try { // very bad code
my();
whole();
ugly();
application();
here();
} catch (Throwable t) {
// pretend it's ok
}
しかし、これが現代のプログラミング言語の例外の理由ではありません。
使用することもできますwhile
し、break
代わりに、if
これはものではありませんwhile
し、break
ためのものです。