web-dev-qa-db-ja.com

基本的に、システムのクラッシュを防ぐための例外はありますか?

第二に、例外(例外制御フローの領域)と例外(Javaで使用されるものなど)の違いを誰かが知っているのかどうか疑問に思いました。

しかし、それらは基本的にユーザープログラムを終了することによってシステムがクラッシュするのを防ぐためにありますか?

16
Dark Templar

例外は 例外処理 を許可するために存在します。これにより、クラッシュを回避できますが、より一般的には、不要なまたは予測できないシステム動作を防止できます。たとえば、データベースへのプログラムの接続がタイムアウトした場合、通常はシステムがクラッシュしませんが、データベースのデータに依存している場合、例外により、このデータのない状況を通常とは異なる方法で処理できます。

デフォルトで、私のプログラムはデータベースから返されたものに基づいてデータのページを表示するとします。めちゃくちゃなビューを表示したり、潜在的に無効な操作を続行したりする代わりに、この例外をキャッチして別のデータベースにフォールバックし、ローカルデータから読み取り、ユーザーにデータを要求するか、ユーザーまたはシステムを安全な状態(おそらく1つ)に戻すことができます同じ例外はすぐには発生しません!)

さらに、ユーザー入力が問題の原因/解決策となる可能性のあるシステムでは、例外によって、問題に関する詳細で役立つ情報をユーザーに知らせることができます。あまりにも一般的な「処理されない例外が発生しました...」や「SQLから直接脅迫するエラーメッセージ」の代わりに、「リソースBに接続できませんでした」など、役立つか少なくとも理解できることをユーザーに伝えることができます。

29
Ben Brocka

エラー処理を簡略化するために例外が作成されました。例外なく、エラー処理ロジックはアプリケーション全体に分散させる必要があります。エラーが発生する可能性のある関数は、なんらかの理由でエラーステータスを返し、各呼び出しの後にエラーチェックを行う必要があります。多くの場合、呼び出し元はエラーが発生した場合に役立つことは何もできず、エラーのみを返すことができます。アプリケーションコードの半分は、エラー処理に費やされる場合があります。このようなコードは非常に脆弱です。エラーチェックを省略してクラッシュさせたり、さらには気付かれないエラーが原因で誤った結果を返したりするのは非常に簡単です。

例外を除いて、エラーは処理可能な時点でのみチェックできます。関数は使用可能な値を返すか、例外をスローするため、ほとんどのアプリケーションコードは直線的に記述できます。

16
kevin cline

例外のポイントは、例外的な状況をユーザーに通知することです。システムに問題が発生した場合、プログラムはそれを認識し、*適切に処理する必要があります。

とはいえ、システムが「クラッシュ」するのを防ぐための例外は存在しません。例外は問題があることを知らせています。どのように進めるかによって、システムが「クラッシュする」かどうかを判断できます。

また、あなたが言ったように、例外がアプリケーションを終了する必要がないことにも注意してください。例外はプログラマーによって処理され、ユーザーにとって修正または意味のあるエラーに変換されます。


*チェックされた例外(強制的にキャッチされる例外)の使用は少し痛い点です。一部の(おそらくほとんどの)開発者は、強制的な例外処理が煩雑で不要であり、単に悪い習慣であることに気づきます。

5
user7007

例外では、エラーハンドラからエラーの場所を分割することにより、最新のエラー処理が可能です。時々これはフロー制御にも使用されます。

未処理の例外はプログラムを終了します。ただし、これらは以前の例外と同じです。適切なエラーハンドラーをすべてのパスに含めるのを忘れた怠惰なプログラマーだけが、エンドユーザーに表示されます。例外によって終了したプログラムは、他の予期しない終了と同じようにクラッシュしたと見なします。

OSは、どのようにクラッシュしたかに関係なく、クラッシュしたプロセスをクリーンアップするのに非常に優れているため、例外は、誤動作しているプロセスを終了してリソースを解放する以外の方法でOSの安全性を高めません。

2
Jürgen Strobel

とても簡単です。

  • システム全体ではなくプログラムのみをクラッシュさせるために-[良い]オペレーティングシステムがあります。
  • 致命的なエラーを無視する代わりにプログラムをクラッシュさせるには-例外があります。

例外が発生する前は、すべての関数が終了コード(エラー/成功)を返す必要があり、関数へのresultまたはoutputは、関数にポインタを渡して取得する必要がありましたそれによって設定されるメモリ。

問題は、多くのプログラマーがすべての関数の誤った終了コードをチェックすることを覚えていないため、致命的なエラーが無視されることがあり、説明のつかない動作につながりました。

したがって、決定されました-考慮しなかったエラーが発生した場合、すぐにクラッシュします!別名例外処理。

2
Yam Marcovic

例外は単なるエラー検出メカニズムです。単独では役に立たない。

しかし、エラーを検出することにより、フォールトトレランスメカニズムをトリガーして、エラーのない状態(以前の状態または新しい状態)に切り替えることで、エラー状態から回復できます。このようにして、エラーはシステムの他の部分に伝搬されません。

1
mouviciel

エラー処理フロー(プログラムが例外的な状況から回復しようとする方法)から別の通常のプログラムフロー(プログラムが行うように設計されている)までの例外があります。

これにより、コードがより明確になり、保守が容易になります。

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の目的ではありません。

0
Michał Šrajer