4

Cプログラマーとして、私は例外についてあまり経験がありません。私はむしろerrno、いくつかの関数呼び出し間でエラーを伝達する手段として慣れています。そうは言っても、例外の際立った特徴は見当たらないので...

例外と使用の根本的な違いは何errnoですか?

4

6 に答える 6

4

ここには非常に多くの違いがあり、どこから始めればよいかを言うのは難しいです。

まず第一にerrno、Cで使用されるのはグローバル変数です。つまり、-settingサブルーチンを呼び出すすべてのルーチンは、正確性を重視する場合、他の作業を実行する前にerrnoチェックする必要があります。errno幸いなことに、errnoはスレッドセーフです。

C ++例外は、障害を処理する準備ができている関数が見つかるまで、呼び出しスタックを自動的に巻き戻します。これは、ほとんどの場合、ユーザーがすべての呼び出しでエラーを明示的にチェックする必要がないことを意味します。代わりに、エラーリターンを1か所に集めることができます。C ++例外には、errnoとは異なり、整数以外の値を含めることができます。

于 2011-05-13T01:15:58.410 に答える
3

例外に直面して正しいプログラムを書くことは容易ではないことを指摘せざるを得ないと感じています。おそらく今週の達人から始めて、このテーマについていくつかの調査を行うのが得策です。単語を探してくださいexception

于 2011-05-13T02:07:54.063 に答える
3

errnoは何気なく無視できます。例外に対処する必要があります。

もちろん、私は自分のシェアを見てきました:

try {
   // something
}
catch( ... ) {
   // nothing
}
// continue as if nothing happened

および(Java)

try {
   // something
}
catch( Throwable t ) {
   // nothing
}
// continue as if nothing happened

しかし、少なくとも、他の誰かの混乱を耕しているとき、そのようなものがあなたに飛び出します。

于 2011-05-13T01:19:48.830 に答える
2

1)例外は、整数だけでなく、何でもかまいません。したがって、通信されるデータは異なります。

2)例外は非ローカル制御フローを実行するため、実際の方法ですべてのレベルでチェックする必要はありません。errnoエラーを示す値も返し、すべての呼び出し元がエラーをチェックし、エラーが発生した場合は早期にベイルアウトします。発生した。逆に、エラーリターンはローカル制御フローを実行するため、エラーが特定のコードを介して伝播されるタイミングを常に正確に確認できます。この違いにより、コーディングスタイルが根本的に変わります。ですから、コミュニケーションの手段も異なります。

于 2011-05-13T01:14:10.860 に答える
2

私にとって最も重要な違いは、errno簡単に無視できることですが、例外は無視するのがかなり難しいです。例外を無視すると、プログラムは終了します...さらに、例外は(まあ、そうあるべきです)オブジェクトなので、実行できます。より有用な情報。

もう1つの非常に重要な違いは、ソフトウェアが問題の処理方法を情報に基づいて実際に決定できる時点で例外を簡単に処理できることです。これは通常、呼び出しスタックの数レベル上です。これは、エラーコードで行うのはそれほど簡単ではありません。

于 2011-05-13T01:17:03.000 に答える
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()が例外をスローしたかのように大まかに動作することになりますが、それほど速くはありません。

于 2011-05-13T17:12:23.137 に答える