Как определить, относится ли исключение к определенному типу - PullRequest
62 голосов
/ 14 февраля 2012

У меня есть кусок кода попытки:

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

Для этого фрагмента кода я пытаюсь вставить запись в базу данных: dba настроил ее так, чтобы база данных проверяла дубликаты и возвращала ошибку, если есть дубликаты. В настоящее время, как вы можете видеть, я добавляю одну и ту же ошибку в модель независимо от того, какая ошибка произошла. Я хочу, чтобы это изменилось, поэтому эта ошибка добавляется в модель только в том случае, если она была вызвана повторяющейся ошибкой, установленной dba.

Ниже приведена ошибка, которую я хочу уловить. Обратите внимание, что это во внутреннем исключении. Может кто-нибудь сказать мне, как конкретно поймать этот?

enter image description here

Ответы [ 6 ]

115 голосов
/ 14 февраля 2012

до вашего текущего улова добавьте следующее:

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...
}
12 голосов
/ 30 июня 2015

Замените 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
    }
}
1 голос
/ 29 ноября 2017

Для получения названия исключения вы можете использовать

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }
0 голосов
/ 19 июня 2019

Недостаточно повторений, чтобы комментировать.В ответ на вопрос @conterio (в ответе @Davide Piras):

есть ли синтаксис "когда нет"?

Есть.

catch (Exception e) when (!(e is ArgumentException)) { }
0 голосов
/ 28 сентября 2017

значит ли ты

catch (Exception e){
    if ( e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException")
    //if (e.GetType().Name == .....)
}
0 голосов
/ 14 февраля 2012

Вы можете взглянуть на класс SQLException и проверить содержимое сообщения об исключении, если оно содержит то, что вы видите во внутреннем исключении. Что-то вроде этого:

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...