私はコードをキャッチしようとしています:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
このコードでは、データベースにレコードを挿入しようとしています。データベースが重複をチェックし、重複がある場合はエラーを返すように、dbaが設定しました。現在、ご覧のとおり、どのエラーが発生しても、モデルに同じエラーを追加しています。変更したいので、dbaによって設定された重複エラーが原因である場合にのみ、このエラーがモデルに追加されます。
以下は私がキャッチしたいエラーです。内部例外にあることに注意してください。誰もこれを具体的にキャッチする方法を教えてもらえますか?
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...
}
置換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
}
}
使用できる例外の名前を取得するには
catch (Exception exc){
if (exc.GetType().FullName == "Your_Exception")
{
// The same can be user for InnerExceptions
// exc.InnerException.GetType().FullName
}
}
コメントするのに十分な担当者がいません。 @conterioの質問に対する回答(@Davide Pirasの回答):
「not when」構文のキャッチはありますか?
がある。
catch (Exception e) when (!(e is ArgumentException)) { }
という意味ですか
catch (Exception e){
if ( e.GetType() == XyzException)
//if (e.GetType().ToString() == "XyzException")
//if (e.GetType().Name == .....)
}