Cプログラマーとして、私は例外についてあまり経験がありません。私はむしろerrno
、いくつかの関数呼び出し間でエラーを伝達する手段として慣れています。そうは言っても、例外の際立った特徴は見当たらないので...
例外と使用の根本的な違いは何errno
ですか?
ここには非常に多くの違いがあり、どこから始めればよいかを言うのは難しいです。
まず第一にerrno
、Cで使用されるのはグローバル変数です。つまり、-settingサブルーチンを呼び出すすべてのルーチンは、正確性を重視する場合、他の作業を実行する前にerrno
チェックする必要があります。errno
幸いなことに、errnoはスレッドセーフです。
C ++例外は、障害を処理する準備ができている関数が見つかるまで、呼び出しスタックを自動的に巻き戻します。これは、ほとんどの場合、ユーザーがすべての呼び出しでエラーを明示的にチェックする必要がないことを意味します。代わりに、エラーリターンを1か所に集めることができます。C ++例外には、errnoとは異なり、整数以外の値を含めることができます。
例外に直面して正しいプログラムを書くことは容易ではないことを指摘せざるを得ないと感じています。おそらく今週の達人から始めて、このテーマについていくつかの調査を行うのが得策です。単語を探してくださいexception
。
errnoは何気なく無視できます。例外に対処する必要があります。
もちろん、私は自分のシェアを見てきました:
try {
// something
}
catch( ... ) {
// nothing
}
// continue as if nothing happened
および(Java)
try {
// something
}
catch( Throwable t ) {
// nothing
}
// continue as if nothing happened
しかし、少なくとも、他の誰かの混乱を耕しているとき、そのようなものがあなたに飛び出します。
1)例外は、整数だけでなく、何でもかまいません。したがって、通信されるデータは異なります。
2)例外は非ローカル制御フローを実行するため、実際の方法ですべてのレベルでチェックする必要はありません。errno
エラーを示す値も返し、すべての呼び出し元がエラーをチェックし、エラーが発生した場合は早期にベイルアウトします。発生した。逆に、エラーリターンはローカル制御フローを実行するため、エラーが特定のコードを介して伝播されるタイミングを常に正確に確認できます。この違いにより、コーディングスタイルが根本的に変わります。ですから、コミュニケーションの手段も異なります。
私にとって最も重要な違いは、errno
簡単に無視できることですが、例外は無視するのがかなり難しいです。例外を無視すると、プログラムは終了します...さらに、例外は(まあ、そうあるべきです)オブジェクトなので、実行できます。より有用な情報。
もう1つの非常に重要な違いは、ソフトウェアが問題の処理方法を情報に基づいて実際に決定できる時点で例外を簡単に処理できることです。これは通常、呼び出しスタックの数レベル上です。これは、エラーコードで行うのはそれほど簡単ではありません。
組み込みシステムで役立つと思ったパターンの1つは、ストリームごとにエラーフラグを設定することですが、フラグが設定されているときに試行されるI/O操作はすぐに失敗します。したがって、コードは次のようなことを行うことができます。
pkt_type = tcp_getbyte(my_stream、timeout); pkt_length = tcp_getbyte(my_stream、timeout); pkt_length | = tcp_getbyte(my_stream、timeout)<< 8; if(pkt_length <MAX_PACKET_LENGTH) {{ for(i = 0; i <pkt_length; i ++) buffer [i] = tcp_getbyte(my_stream、timeout); } if(!my_stream-> error) {{ /*パケットで何かをする*/ }
1バイトの取得がタイムアウトした場合、後続の試行は無条件に失敗し、ゼロを返します。すべての操作に失敗がないかチェックする必要はありません。何かがうまくいかない場合、システムは、tcp_getbyte()が例外をスローしたかのように大まかに動作することになりますが、それほど速くはありません。