1

次のコードがあります。

       try
       {
           retval = axNTLXRemote.IsUnitPresent(_servers[0].IPAddress, 1, _servers[0].RemotePort, _servers[0].CommFailDelay * 1000);
       }
       catch (COMException ce)
       {
            throw ce;
       }

これにより、取り除きたい次の警告が表示されます。

CA2200 : Microsoft.Usage : 'Connect()' は、キャッチされた例外を再スローし、引数として明示的に指定します。代わりに、例外が最初に発生したスタックの場所を保持するために、引数なしで 'throw' を使用してください。

私は次のtry/catch/throwとtry/catch(e)/throw eの違いを読んだことがあります。スタック トレースをリセットし、その関数から例外がスローされたかのように表示します。

警告を取り除く「throw ce」ではなく「throw」に変更したいだけです。

  1. 次のキャッチの違いは何ですか:

       catch (COMException ce)
       {
            throw;
       }
    

       catch (COMException)
       {
            throw;
       }
    
  2. どうにかして ce 変数を使用したい場合、'COMException ce' だけが必要ですか?

  3. また、「throw」または「throw ce」を実行すると、それを処理またはキャッチするのは呼び出し関数ですか?? 私はこれについて少し不明です。

4

3 に答える 3

1

どちらの場合も違いはありませんが、例外変数をスタック/メッセージなどに使用する必要がある場合のみです。

そう:

catch(ComException);

catch(ComException ex);

ステートメントは、ComException オブジェクトのローカル変数を除いて、同様の MSIL を生成します。

.locals init ([0] class [mscorlib]System.Exception ex)
于 2013-06-06T14:14:57.037 に答える
1
  1. 唯一の違いは、catch (COMException ce)では例外を変数に割り当てているため、catchブロック内で例外にアクセスできることです。それ以外は、あらゆる点で同一です。
  2. ここで質問が何であるかわかりません。catch例外オブジェクトにアクセスする場合は、句で変数名を指定する必要があります。
  3. 例外がスローされる方法や場所に関係なく、例外はコール スタックを介しcatchて一致する最も近いブロックにバブル アップします。

これが例です。

void Method1()
{
    try
    {
        Method2();
    }
    catch // this will catch *any* exception
    {
    }
}

void Method2()
{
    try
    {
        Method3();
    }
    catch (COMException ex) // this will catch only COMExceptions and exceptions that derive from COMException
    {
    }
}

void Method3()
{
    // if this code were here, it would be caught in Method2
    throw new COMException();


    // if this code were here, it would be caught in Method1
    throw new ApplicationException();
}
于 2013-06-06T14:21:36.993 に答える
1

誰かが非常に技術的な答えに飛びつくと確信していますが、私の経験では、最初の2つの質問に対する答えは違いがないということですce。スタック トレースをログに記録したり、ユーザーにメッセージを表示したりします。

throwは例外をチェーンの上に送信します。それは呼び出し元のメソッドである可能性があります。または、メソッドにいくつかのネストされた try/catch ブロックがある場合は、現在の try/catch ブロックがネストされている次の try/catch ブロックに例外を送信します。

この件についてさらに読みたい場合は、次のいくつかの優れたリソースを確認してください。

于 2013-06-06T14:18:12.853 に答える