例外が特定のタイプであるかどうかを判断する方法


82

トライキャッチコードがあります:

try 
{
    ...
}
catch(Exception ex) 
{
    ModelState.AddModelError(
        "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}

このコードでは、データベースにレコードを挿入しようとしています。dbaは、データベースが重複をチェックし、重複がある場合はエラーを返すように設定しています。現在、ご覧のとおり、どのようなエラーが発生しても、同じエラーをモデルに追加しています。このエラーは、dbaによって設定された重複エラーが原因である場合にのみモデルに追加されるように変更したいと思います。

以下は私がキャッチしたいエラーです。内部例外にあることに注意してください。誰かがこれを具体的に捕まえる方法を教えてもらえますか?

ここに画像の説明を入力してください


1
ダビデの答えを参照してください。一般的に、キャッチExceptionはベストプラクティスではありません。できるだけ具体的にし、処理できないものはすべてユーザー/フレームワークにまでバブルさせる必要があります。
ライアン

1
この答えをチェックアウト: stackoverflow.com/questions/3967140/...
ロブ・パックウッド

回答:


141

現在の漁獲量のに、以下を追加します。

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}

C#6から、次のことができます。

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}

3
「そうでないとき」の構文はありますか?
conterio 2018年

4
@conteriocatch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
トム

16

System.Threading.ThreadAbortException例外と交換してください。

try
{
    //assume ThreadAbortException occurs here
}
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException)))
    {
         //what you want to do when ThreadAbortException occurs         
    }
    else
    {
         //do when other exceptions occur
    }
}

3

例外の名前を取得するには、次を使用できます

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }

2
文字列による例外タイプの比較は危険です。不幸なスペルミスは、例外処理を悪夢にするでしょう!
TejasPendse19年

同意しました。タイプをタイプと比較します。exc.GetType()== typeof(YourException)
LeeOades20年

2

コメントするのに十分な担当者がいません。@conterioの質問(@Davide Pirasの回答)への回答:

「そうでないとき」の構文はありますか?

有る。

catch (Exception e) when (!(e is ArgumentException)) { }

-3

SQLExceptionクラスを見て、内部例外に現在表示されているものが含まれているかどうか、例外のメッセージの内容を確認できます。次のようなものです。

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}

1
SqlExceptionが直接スローされるのではないかと思いますが、内部例外としてのみです。また、メッセージテキストと比較するよりも、エラー番号を確認する方がよいでしょう。
ジョンサンダース

はい、エラー番号も確認できます。コメントありがとうございます。
アンBG

エラー番号をどのように確認しますか?それは本当に特定のエラーなので、私はそれが何であるかさえわかりませんか?
AnonyMouse 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.