web-dev-qa-db-ja.com

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

私はコードをキャッチしようとしています:

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

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

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

enter image description here

65
AnonyMouse

before現在のキャッチは以下を追加します:

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...
}
117
Davide Piras

置換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
    }
}
13
Nishantha

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

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

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

「not when」構文のキャッチはありますか?

がある。

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

という意味ですか

catch (Exception e){
    if ( e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException")
    //if (e.GetType().Name == .....)
}
0
T.Todua