2009-04-07 2 views
1

Wir alle wissen, dass wir die Ausnahme Wrapping verwenden können (und fangen Sie es später wo erforderlich). Was ich jedoch (und elegant) implementieren möchte, ist die Unterscheidung der Fehlerarten nach dem Aufruf des Stored Proc.Fehlerbehandlung Flexibilität

Ich habe p_error Feld, wo gespeicherte Proc seine Fehler ablegt. Es könnte ein Validierungsfehler sein (wo eine Validierung gegen die DB nicht vermieden werden kann), oder ein Autorisierungsfehler (wir machen das an 2 Stellen, von denen eine DB ist) oder ein SQL-Fehler.
Kurz gesagt brauche ich einen hübschen und eleganten Mechanismus, um zwischen dem Fehlertyp zu unterscheiden, bevor eine Ausnahme ausgelöst wird.

Zwei Ansätze, die ich gedacht:

  1. Auf der Datenbankebene haben 3 Fehlerfelder: 1 für die Zulassung 1 für SQL-Fehler und 1 für alle anderen Fehler. Das könnte haarig werden.

  2. Erstellen eines Fehlers struct (enum?), In dem Fehlermeldungen gespeichert und später verglichen werden können. Wiederum zu wortwörtlich. Was passiert, wenn sich eine Fehlermeldung in db ändert ... zu schwer zu warten.

Irgendwelche anderen Ideen?

Antwort

1

Ich sehe nicht, warum Leute diesen p_error Unsinn machen. Zumindest mit Oracle (und ich bin mir ziemlich sicher mit SQL-Server auch) das Ergebnis des Aufrufs einer gespeicherten Prozedur, die eine Ausnahme auslöst, ist eine erhobene Ausnahme, die weit mehr Informationen als dieses dumme p_error-Feld möglicherweise enthalten kann.

Auch meine letzte Erfahrung ist einfach mit Orakel, aber ich würde einen Wrapper für alle Stored Procedure Calls (gängige Praxis sowieso) und im Inneren etwas wie dieses

try { 
    RunMyStoredProcedure(); 
} 
catch(OracleException e) { 
    new OracleExceptionProcessor().HandleException(e); 
} 
//... 
//... 
class OracleExceptionProcessor { 
    static List<int> _validationErrorCodes = new List<int> { 123, 456}; 
    static List<int> _authenticationErrorCodes = new List<int> { 789}; 

    public void HandleException(OracleException ex) { 
    if(_validationErrorCodes.Any(c==ex.ErrorCode)) 
     throw new DatabaseValidationError(ex); 
    if(_authenticationErrorCodes.Any(c==ex.ErrorCode)) 
     throw new DatabaseAuthenticationError(ex); 
    throw new DatabaseSQLError(ex); 
    } 
} 

tun schreiben Da ich das nicht vorstellen kann, Datenbank mit all den vielen Validierungs- oder Authentifizierungsfehlercodes sollte dies ziemlich einfach und einfach sein.

+0

Danke. Ich werde klarer sein. Es gibt zwei Arten von Fehlern: auf Anwendungsebene gefangen und in der Datenbank gefangen. Wir verwenden keine OracleException. eigentlich bin ich verpflichtet, eine Wrapper-Klasse zu verwenden, die sich mit Oracle beschäftigt, sie wirft ihre eigenen Ausnahmen, die ich erwische. – sarsnake

+0

Aber Ihre Idee ist grundsätzlich Fehlercodes zur Unterscheidung der Fehlerarten zu verwenden. Frage: Sind diese benutzerdefinierten Codes? – sarsnake

+0

Abfangen von Fehlern in der Datenbank Ich (und viele andere) betrachten sehr schlechte Form. Ich nehme an, dass du zurück in die SP rollst? Dies sollte in der Verantwortung der anrufenden Anwendung liegen. Wenn ich dies tue, werfe ich immer die Ausnahme zurück. Sie können immer noch meinen Ansatz machen, wenn Sie den Fehlercode –