例外的な


心配しないでください、これはC言語がどれくらい大きいかに関する記事でありません.前に炎なし.これは、100行のコードでCに例外処理を追加する方法についてです.コメントはここにあります(ここで利用可能です:https://github.com/rdentato/try).
例外とは、予期しないことが起こったことを示すための方法であり、プログラムを続けることができるようにするための特別な措置が必要である(またはプログラムが実行できない場合だけプログラムを終了する).
誤りをきれいに扱う方法として意図されて、彼らは時々、彼らの有効性についていくつかの疑惑を導きました.
アイデアは単純です:例外がスローされると、コントロールがプログラムの指定された部分にジャンプし、例外が捕捉され、解析され、適切なアクションが取られます.
例外を提供する言語( C++, Java , python , ...)GOTO/try命令でそれをしてください.以下のようになります.
try {
    ... Your code here with calls to distant functions
}
catch {
    ... The code that is executed if an exception has been thrown 
    ... by the code in the try block or any function called by it.
}
Cでのエラー処理ではなく、エラーコードを返す関数および/または242479142の設定に依存します.エラーが発生したかどうかを判断するために呼び出し元になり、正しい措置を取って、呼び出し元のチェーンで意味のある方法でそれを伝播させる可能性があります.
これは簡単に行うことができないので、適切に行うには、エラーがアプリケーションでどのように伝播するかを適切に計画する必要があります.
  • 全体のロジックは、単にエラーを処理するためにより複雑になります
  • 本当に例外的なエラー(例えば、メモリシステムは完全ではない.プログラムが終了するか、あるいは、まったく処理されません.
  • 私は、Cプログラムがよりよく書かれることができた状況があると主張します.
    私たちはCでcatch/errnoブロックを持っていません、しかし、我々は同じ目的を果たすことができる何かを持っています:try/catch.
    彼らは非ローカルのgotoを許可します:あなたはsetjmp()で戻り点をセットして、longjmp()でそれに戻ります.
    このメカニズムはほとんど使われていません(そして、全く正しく!)そして、setjmp()がコードのセットされたリターンポイントにジャンプするのを許容するために通過されなければならないタイプlongjmp()の変数で状態を保存することを含みます.正確には簡単ではない.
    私は何か簡単に使用したいと思っていたので、私はここで見つけることができるjmp_buf/longjmp()命令の私自身のバージョンを作成した理由です.
    Cではtry/catchのインターネット上の他の実装を見つけることができます.
  • はCシンタックス(例えば醜いtry/catch組なしで)にうまく合いました;
  • 任意の関数から例外をスローすることを許可します
  • ネストされたsetjmp()ブロックは、呼び出された関数の中でもブロックします
  • より良いエラーメッセージのために、例外がスローされた場所に関する情報(ファイルと線).
  • スレッドセーフ.(私にとって本当にプライオリティーではないが、良いものがある)
  • 最後のポイントについては、私ができることは、単一のスレッドではなく、非常に混乱していたスレッド全体で作業242479142/longjmp()を持つことができることです!
    全体的に、私はその結果に満足しています.あなたが私が内部でどのように働くかについてのフォローアップを書きたいならば、下記のコメントで私に知らせてください、私は1つを書くことが幸せです.
    ここでは、例外処理がどのように見えるかということです.
      #include "try.h"
    
      #define OUTOFMEM    1
      #define WRONGINPUT  2
      #define INTERNALERR 3
    
      void some_other_func()
      {
        ... code ...
        if (invalid(getinput())) throw(WRONGINPUT);
        ... code ...
      }
    
      int some_func() 
      {
        ... code ...
        try {
          ... code ...
          if (no_more_memory) throw(OUTOFMEM) 
    
          some_other_func();      // you can trhow exceptions
                                  // from other functions 
    
          ... code ...            // You MUST NEVER jump out of a try/catch block
                                  // via return, goto or break.
        }  
        catch(OUTOFMEM) {
          ... code ...
        }
        catch(WRONGINPUT) {
           ... code ...
        }
        catchall {                 // catch any other exception
           ... code ...            // otherwise the progam would abort.
        }
        ... code ...
     }