Mam kod catch:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
W przypadku tego fragmentu kodu próbuję wstawić rekord do bazy danych: dba skonfigurował go tak, że baza danych sprawdza, czy istnieją duplikaty i zwraca błąd, jeśli są duplikaty. Obecnie jak widać dodam ten sam błąd do modelu bez względu na to jaki błąd wystąpił. Chcę, żeby to się zmieniło, więc ten błąd jest dodawany do modelu tylko wtedy, gdy został spowodowany przez zduplikowany błąd ustawiony przez dba.
Poniżej znajduje się błąd, który chcę wyłapać. Zauważ, że jest to wewnętrzny wyjątek. Czy ktoś może mi powiedzieć, jak konkretnie to złapać?
c#
asp.net-mvc
exception-handling
AnonyMouse
źródło
źródło
Exception
nie jest najlepszą praktyką. Powinieneś być tak dokładny, jak to tylko możliwe i pozwolić, aby wszystko, z czym nie możesz sobie poradzić, dotarło do użytkownika / struktury.Odpowiedzi:
przed twoim bieżącym połowem dodaj:
catch(DbUpdateException ex) { if(ex.InnerException is UpdateException) { // do what you want with ex.InnerException... } }
W języku C # 6 możesz wykonać następujące czynności:
catch(DbUpdateException ex) when (ex.InnerException is UpdateException) { // do what you want with ex.InnerException... }
źródło
catch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
Zamień na
System.Threading.ThreadAbortException
swój wyjątek.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 } }
źródło
Aby uzyskać nazwę wyjątku, możesz użyć
catch (Exception exc){ if (exc.GetType().FullName == "Your_Exception") { // The same can be user for InnerExceptions // exc.InnerException.GetType().FullName } }
źródło
Za mało przedstawiciela do komentowania. W odpowiedzi na pytanie @conterio (w odpowiedzi @Davide Piras):
Jest.
catch (Exception e) when (!(e is ArgumentException)) { }
źródło
Możesz rzucić okiem na klasę SQLException - i sprawdzić zawartość komunikatu o wyjątku, jeśli zawiera on to, co teraz widzisz w swoim wewnętrznym wyjątku… Coś takiego:
try { //your code here } catch (SQLException ex) { if (ex.Message.Contains("Cannot insert duplicate key in obj....")) { //your code here } }
źródło