У меня есть фрагмент кода попытки перехвата:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
Для этого фрагмента кода я пытаюсь вставить запись в базу данных: dba настроила ее так, чтобы база данных проверяла наличие дубликатов и возвращала ошибку, если дубликаты есть. В настоящее время, как вы можете видеть, я добавляю в модель одну и ту же ошибку независимо от того, какая ошибка произошла. Я хочу, чтобы это было изменено, чтобы эта ошибка добавлялась в модель только в том случае, если она была вызвана повторяющейся ошибкой, установленной dba.
Ниже приведена ошибка, которую я хочу поймать. Обратите внимание, что это внутреннее исключение. Может кто подскажет, как конкретно эту ловить?
c#
asp.net-mvc
exception-handling
AnonyMouse
источник
источник
Exception
- не лучшая практика. Вы должны быть как можно более конкретными и позволять всему, с чем вы не можете справиться, всплывать перед пользователем / фреймворком.Ответы:
перед вашим текущим уловом добавьте следующее:
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... }
источник
catch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
Замените
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):
Есть.
catch (Exception e) when (!(e is ArgumentException)) { }
источник
Вы можете взглянуть на класс SQLException - и проверить содержимое сообщения об исключении, если оно содержит то, что вы сейчас видите во внутреннем исключении… Примерно так:
try { //your code here } catch (SQLException ex) { if (ex.Message.Contains("Cannot insert duplicate key in obj....")) { //your code here } }
источник