Как определить, является ли исключение определенного типа
У меня есть кусок кода catch catch:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
Для этого фрагмента кода я пытаюсь вставить запись в базу данных: dba настроил ее так, чтобы база данных проверяет дубликаты и возвращает ошибку, если есть дубликаты. В настоящее время, как вы можете видеть, я добавляю ту же ошибку к модели независимо от произошедшей ошибки. Я хочу, чтобы он изменился, поэтому эта ошибка добавляется только к модели, если она была вызвана дублирующейся ошибкой, установленной dba.
Ниже приведена ошибка, которую я хочу поймать. Обратите внимание на это во внутреннем исключении. Может ли кто-нибудь сказать мне, как конкретно поймать этот?
![enter image description here]()
Ответы
Ответ 1
перед вашим текущим уловом добавьте следующее:
catch(DbUpdateException ex)
{
if(ex.InnerException is UpdateException)
{
// do what you want with ex.InnerException...
}
}
Из С# 6 вы можете сделать следующее:
catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
// do what you want with ex.InnerException...
}
Ответ 2
Замените 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
}
}
Ответ 4
do yo означает
catch (Exception e){
if ( e.GetType() == XyzException)
//if (e.GetType().ToString() == "XyzException")
//if (e.GetType().Name == .....)
}
Ответ 5
Недостаточно представителей, чтобы комментировать. В ответ на вопрос @conterio (в ответе @Davide Piras):
есть ли улов "когда нет" синтаксис?
Есть.
catch (Exception e) when (!(e is ArgumentException)) { }
Ответ 6
Вы можете взглянуть на класс SQLException и проверить содержимое сообщения об исключении, если оно содержит то, что вы теперь видите в своем внутреннем исключении. Что-то вроде этого:
try
{
//your code here
}
catch (SQLException ex)
{
if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
{
//your code here
}
}