-1

以下はコード スニペットです。

class xxx
{

  public xxx(){}

  try
  {
    throw new Exception(InvalidoperationException);
  }
  catch(Exception x)
  {
  }
  catch(InvalidoperationException x)
  {
  }
}

ここで発生する例外とその背後にある理由を誰でも知ることができます。

4

7 に答える 7

8

うわー、ここには多くの問題があります。どこから始めれば?

  1. そのコードはコンパイルされません。定義したtry-catchブロックは、許可されていないメソッドの外側にあります。メソッドに移動する必要があります。

  2. メソッドの後半で自分自身をキャッチするつもりのメソッドをスローしないでください。これは、「フロー制御」に例外を使用することとして一般的に知られていますが、これは完全に推奨されていません。これにはパフォーマンス コストが伴います。また、独自の例外をスローしてキャッチするコードがある場合、デバッガーを使用するとスローされる例外を監視するのが非常に混乱します。必要に応じて、フロー制御にブール変数 (フラグと呼ばれる) を使用します。

  3. 常に、最も派生した例外クラスを最初にキャッチします。つまり、をキャッチしようとする前にInvalidOperationException、最初にキャッチする必要があります。コード内のブロックの順序を逆にする必要があります。Exceptioncatch

  4. あなたは実質的に決して捕まえるべきではありませんSystem.Exception。キャッチする必要がある唯一の例外は、明示的に理解し、処理できる例外です。一般的な例外がスローされたという情報しか得られない場合、何が問題なのか、またはそれをどのように処理するのかを知る方法は事実上ありません。

    同じように、独自のコードからこの例外をスローしないでください。基本クラスから継承する、より記述的な例外クラスを選択するSystem.Exceptionか、同じクラスから継承して独自の例外クラスを作成します。


他の回答が、コードを書き直した場合に、コードがどのように見えるべき かのサンプルコードを示していることがわかります。あなたのコードを正しく書き直すと、次のようになるので、私はそれをするつもりはありません:

class Xxx
{
    public Xxx()
    {

    }
}

特に役に立ちません。

于 2011-05-07T08:39:43.137 に答える
2

コードがこのような場合

 class xxx
    {

      public xxx(){

      try
      {
        throw new Exception(InvalidoperationException);
      }

      catch(InvalidoperationException x)
      {
      }

catch(例外 x) { } } }

コンパイルして例外を発生させ、キャッチする必要があります。そうしないと、コードはまったくコンパイルされません。

于 2011-05-07T08:35:18.830 に答える
1

このコードはコンパイルされないため、例外はスローされません。

とにかく - いくつかのポイント:

  • 例外処理を使用する場合は、より具体的な例外をより具体的でない例外の前に置きます (したがって、 のキャッチは のキャッチよりInvalidOperationExceptionも前に配置する必要がありますException)。
  • Exception通常、キャッチはあまり役に立ちません。
  • 例外をキャッチした場合は、それを処理します。

あなたはおそらく次のことを意味していました:

throw new InvalidOperationException();

ただし、例外を構造化した方法では、catch(Exception x)ブロックが実行されます。

于 2011-05-07T08:29:27.047 に答える
1

いいえ。コンパイルされません。したがって、どの例外が生成されるかについては疑問の余地がありません。

コードは次のようになります。

class xxx
{
    public void Test()
    {
        try
        {
          throw new InvalidoperationException(); 
        }
        catch(InvalidoperationException exception)
        {
            // Something about InvalidOperationException;
        }            
        catch(Exception exception)
        {
            // Something about the Exception
        }
    } 
}

注意点:

  1. 最初に Exception のより具体的なクラスを記述します。したがって、例外クラスの前に InvalidOperationException を記述します。
于 2011-05-07T08:37:24.347 に答える
0

コードはコンパイルされませんが、無視します...

行だけを見ると:

throw new Exception(InvalidoperationException);

まず第一に、MSDN によると、そのようなコンストラクターはありません。したがって、コンストラクター Exception(String msg, Exception innerException) を意味していると仮定します。意味: throw new Exception("blabla", InvalidoperationException);

スローされる例外のタイプはExceptionであり、 InvalidOperationExceptionではありません。したがって、 catch(Exception x)のみがそれをキャッチできます。

キャッチの順序を記述した方法よりもInvalidoperationExceptionをスローした場合、Exception クラスが最初にキャッチされます。キャッチの順序は重要です。

私があなたに与えることができる最善のアドバイスは、単に自分で試してみて、何が起こるかを確認することです.

于 2011-05-07T08:44:31.627 に答える
0

コンパイルの問題を無視しています....最初に一致する例外ブロック ( catch(Exception x)) が例外を取得します。その後、例外を無視して再スローしないため、例外は外部から見られます。ただし、それは良い習慣にはなりません...特に、任意のものをキャッチExceptionして無視することは危険です-それは何でもあった可能性があります...それは必ずしもあなたが思っていた例外ではありません.

于 2011-05-07T08:40:15.517 に答える