Ich habe einen Versuchscode:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
Für diesen Code versuche ich, einen Datensatz in eine Datenbank einzufügen: Die Datenbank hat ihn so eingerichtet, dass die Datenbank nach Duplikaten sucht und einen Fehler zurückgibt, wenn Duplikate vorhanden sind. Wie Sie sehen, füge ich dem Modell derzeit denselben Fehler hinzu, unabhängig davon, welcher Fehler aufgetreten ist. Ich möchte, dass es geändert wird, damit dieser Fehler nur dann zum Modell hinzugefügt wird, wenn er durch den von der dba eingerichteten doppelten Fehler verursacht wurde.
Unten ist der Fehler, den ich abfangen möchte. Beachten Sie, dass es sich um die innere Ausnahme handelt. Kann mir jemand sagen, wie ich diesen gezielt fangen soll?
c#
asp.net-mvc
exception-handling
AnonyMouse
quelle
quelle
Exception
keine bewährte Methode. Sie sollten so spezifisch wie möglich sein und alles, was Sie nicht handhaben können, an den Benutzer / das Framework weitergeben.Antworten:
Fügen Sie vor Ihrem aktuellen Fang Folgendes hinzu:
catch(DbUpdateException ex) { if(ex.InnerException is UpdateException) { // do what you want with ex.InnerException... } }
Ab C # 6 können Sie Folgendes tun:
catch(DbUpdateException ex) when (ex.InnerException is UpdateException) { // do what you want with ex.InnerException... }
quelle
catch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
Durch
System.Threading.ThreadAbortException
Ihre Ausnahme ersetzen .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 } }
quelle
Um den Namen der Ausnahme zu erhalten, können Sie verwenden
catch (Exception exc){ if (exc.GetType().FullName == "Your_Exception") { // The same can be user for InnerExceptions // exc.InnerException.GetType().FullName } }
quelle
Nicht genug Vertreter, um einen Kommentar abzugeben. Als Antwort auf die Frage @conterio (in der Antwort von @Davide Piras):
Es gibt.
catch (Exception e) when (!(e is ArgumentException)) { }
quelle
Sie können sich die SQLException-Klasse ansehen und nach dem Inhalt der Ausnahmemeldung suchen, wenn sie das enthält, was Sie jetzt in Ihrer inneren Ausnahme sehen. So etwas:
try { //your code here } catch (SQLException ex) { if (ex.Message.Contains("Cannot insert duplicate key in obj....")) { //your code here } }
quelle