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


16

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

しかし、それらは基本的にユーザープログラムを終了することでシステムをクラッシュから保護するためにありますか?

回答:


29

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

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

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


5
これが最も正確な答えだと思います。プログラムは、機能する有限状態マシンです。不良データを導入することでマシンを破壊し、誤動作を引き起こす方法があります。これを防ぐために例外がスローされます。マシンがそれ自体を回復できる場合もあれば、できない場合もあります。
アンディ

1
エラーコードでまったく同じことをすることはできませんか?あなたはエラーを返し、私はそれを処理します。
mskw

16

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

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


5

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

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

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


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


2
私は同意しません、この定義はあまりにも制限されています。例外のサブセットのみをユーザーに表示する必要があります。例外はエラー処理のためのものであり、ユーザーをあきらめて通知することは通常、最後に実行される手順であり、通常ではありません。いくつかのシステムは、反復可能なの終わりのように、あまりにもフロー制御のいくつかの種類のためなど、EOF、例外を使用するように設計されている
ユルゲン・ストローベル

ユルゲン、あなたのコメントを理解し、完全に同意します。「修正されたか、何らかの意味のあるエラーに変わった」-この発言でその考えを伝えていないのか

はい、今はずっと良くなっています。
ユルゲンストロベル

間違いなく、例外はユーザーに表示されるべきでありませ。(それらを生成させる条件は、何らかの方法でユーザーに報告する必要があるかもしれませんが、例外としてではありません。)しかし、例外は、プログラムが単にDIAFやサプライズ終了を行うよりも優れています。(「送信者名で電子メールをソートしようとするたびに、電子メールクライアントは静かに終了します!!」その出口がどれほどきれいであっても、それはまだ間違っています。)
ドナルフェローズ

2

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

未処理の例外はプログラムを終了します。しかし、これらは前の例外と違いはありません。すべてのパスに適切なエラーハンドラーを含めるのを忘れた怠programmerなプログラマーが、エンドユーザーにそれらを表示させます。他の予期しない終了と同じように、プログラムが例外によりクラッシュしたと考えます。

OSはクラッシュするプロセスに関係なく、クラッシュしたプロセスをクリーンアップするのに非常に優れているため、誤動作しているプロセスを終了してリソースを解放する以外に、例外によってOSの安全性が増すことはありません。


オペレーティングシステムがクリーンアップできるものには制限があります。一般に、OSは永続リソース(ファイルなど)をクリーンアップまたはロールバックする必要があるかどうかを知ることも、ローカル側で接続を閉じるだけでなく、リモート接続に必要なクリーンアップがあるかどうかを知ることもできません。
8bittree

2

とても簡単です。

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

例外が発明される前に、すべての関数は終了コード(エラー/成功)を返す必要があり、関数が設定するメモリへのポインターを渡すことにより、関数からの結果または出力を取得する必要がありました。

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

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


1

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

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


0

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

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

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ためのものです。


実際には「異常」の制御フローを処理することで、正確にはgotoとその友人のブレークが最も便利ですとき。例外の利点は、関数の境界を越えることができ、呼び出し元がそれをキャッチするのに最も適切な場所を決定できることです。
hugomg

@hugomg:例外のもう1つの大きな利点は、例外がスローされた場所と処理された場所の間でリソースのクリーンアップなどのアクションを実行できることです。
supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.