C#でスローされる例外の例外タイプを見つけるにはどうすればよいですか?

私は例外を文書化していないようなライブラリを使用しています。このライブラリは、会社が作成した製品と通信するために使用されます。私はスローされる例外を区別できるようにしたいが、例外の名前は分からない(たとえば、通信タイムアウトまたは不足電圧状態の間)。

それらの例はすべて catch(Exception ex)のみを使用しています。個々のエラーをキャッチするために必要なものは、どのようにして見つけることができますか? ex.toString()を実行すると、次のような情報が得られます。

System.Exception: Timeout
    at CMLCOMLib.EcatObj.Initialize()
    at copley_cmo_test.MainWindow.btnConnect_Click(Object sender, RoutedEventArgs e)
in c:\Users\adam.siembida\Desktop\copley_cmo_test\copley_cmo_test\MainWindow.xaml.cs:line 41
1
実際の型を取得するには ex.GetType()を使用できますが、例外メッセージからは Exception を直接投げているようです。
追加された 著者 Lee,
実際の型を取得するには ex.GetType()を使用できますが、例外メッセージからは Exception を直接投げているようです。
追加された 著者 Lee,

10 答え

この:

System.Exception: Timeout

彼らは裸の System.Exception を投げているだけであることを示しています。

if (weHaveNoApiDesignSkills)
{
    throw new Exception("Timeout");
}

いくつかの例外がありますが、あなたが示したものは有望ではありません:(

残念なことに、例外でメッセージを使用してそれらを区別することを開始しない限り(ほとんど常に悪い考えです)、あなたは固執しています。将来のリリースで問題を改善できるかどうかをライブラリの作者に尋ねる価値があります。

11
追加された
@ w1res:非常に壊れやすい - 開発者はリリース間でメッセージを変更することができます。タイプミスを修正する開発者の中にはメッセージの国際化を決めるものもあります。
追加された 著者 Jon Skeet,
私はメッセージで区別することは常に悪い考えだと言います
追加された 著者 matt-dot-net,
+1コードサンプルのみ。 :)
追加された 著者 Chris,
より優れたものがあれば、例外の特定の型を特定する方法についてのコメントもあります。
追加された 著者 Chris,
なぜメッセージで区別するのが悪いのですか?
追加された 著者 w1res,

この:

System.Exception: Timeout

彼らは裸の System.Exception を投げているだけであることを示しています。

if (weHaveNoApiDesignSkills)
{
    throw new Exception("Timeout");
}

いくつかの例外がありますが、あなたが示したものは有望ではありません:(

残念なことに、例外でメッセージを使用してそれらを区別することを開始しない限り(ほとんど常に悪い考えです)、あなたは固執しています。将来のリリースで問題を改善できるかどうかをライブラリの作者に尋ねる価値があります。

11
追加された
@ w1res:非常に壊れやすい - 開発者はリリース間でメッセージを変更することができます。タイプミスを修正する開発者の中にはメッセージの国際化を決めるものもあります。
追加された 著者 Jon Skeet,
私はメッセージで区別することは常に悪い考えだと言います
追加された 著者 matt-dot-net,
+1コードサンプルのみ。 :)
追加された 著者 Chris,
より優れたものがあれば、例外の特定の型を特定する方法についてのコメントもあります。
追加された 著者 Chris,
なぜメッセージで区別するのが悪いのですか?
追加された 著者 w1res,

catch(Exception ex)のようなキャッチオール構文でキャッチし、 ex.GetType()から返された Type を調べます。 typeof(Exception)と等しい場合は、 Exception よりも具体的なものを投げていないことを意味します。

4
追加された

catch(Exception ex)のようなキャッチオール構文でキャッチし、 ex.GetType()から返された Type を調べます。 typeof(Exception)と等しい場合は、 Exception よりも具体的なものを投げていないことを意味します。

4
追加された

デコンパイラを使用してください:

http://www.jetbrains.com/decompiler/

私はそれが唯一の方法だと思うので、javaのような明示的な例外宣言はありません。

1
追加された

デコンパイラを使用してください:

http://www.jetbrains.com/decompiler/

私はそれが唯一の方法だと思うので、javaのような明示的な例外宣言はありません。

1
追加された

ところで、例外が捕捉されたとき(つまりcatchブロック内で)停止している場合、ウォッチウィンドウに $ exception と入力すると例外がすべて表示されます。

0
追加された

ところで、例外が捕捉されたとき(つまりcatchブロック内で)停止している場合、ウォッチウィンドウに $ exception と入力すると例外がすべて表示されます。

0
追加された

使用しているライブラリのAPIが適切に文書化されていない場合は、基本例外をキャッチして、例外を文字列に変換してメッセージ全体だけでなくログに記録する必要があります。例えば。

   try
   {
       //api call which throws exception.
   }
   catch(Exception ex)
   {
       //log ex.ToString();       
   }
0
追加された

使用しているライブラリのAPIが適切に文書化されていない場合は、基本例外をキャッチして、例外を文字列に変換してメッセージ全体だけでなくログに記録する必要があります。例えば。

   try
   {
       //api call which throws exception.
   }
   catch(Exception ex)
   {
       //log ex.ToString();       
   }
0
追加された