2013-04-13 16 views
19

Ich versuche, meine eigene Exception-Klasse in C# zu implementieren. Zu diesem Zweck habe ich eine von Exception abgeleitete CustomException-Klasse erstellt.Zurückgeben einer benutzerdefinierten Ausnahme

class CustomException : Exception 
{ 
    public CustomException() 
     : base() { } 

    public CustomException(string message) 
     : base(message) { } 

    public CustomException(string format, params object[] args) 
     : base(string.Format(format, args)) { } 

    public CustomException(string message, Exception innerException) 
     : base(message, innerException) { } 

    public CustomException(string format, Exception innerException, params object[] args) 
     : base(string.Format(format, args), innerException) { } 
} 

Dann benutze ich es

static void Main(string[] args) 
{ 
    try 
    { 
     var zero = 0; 
     var s = 2/zero; 
    } 
    catch (CustomException ex) 
    { 
     Console.Write("Exception"); 
     Console.ReadKey(); 
    } 
} 

Ich erwarte ich werde meine Ausnahme erhalten, aber alles, was ich ist ein Standard DivideByZeroException bekommen. Wie kann ich eine Division durch Null-Ausnahme mit meiner CustomException-Klasse abfangen? Vielen Dank.

+10

Warum beginnen sollte .NET Ihre Ausnahme zu benutzen? Sie müssen es selbst "werfen" (http://msdn.microsoft.com/en-us/library/1ah5wsex (v = vs.110) .aspx). –

+0

okay, auch wenn ich hinzufügen, werfen neue Ausnahme zu fangen Abschnitt ich werde es nicht bekommen. Ich werde weiterhin Standard Ausnahme erhalten. Muss ich Code in meine CustomException schreiben, um DevideByZero Exceptions zu erfassen? – JohnyMotorhead

+0

Sie sollten nicht, wenn Sie _before_ das div durch Null werfen oder Alexei Ansatz verwenden. Übrigens: Ich denke, es ist nicht gut, Ausnahmen zu ersetzen, es sei denn, Sie haben sehr gute Gründe. –

Antwort

26

Sie können den vom vorhandenen Code ausgelösten Ausnahmetyp nicht ändern.

Sie benötigen eine Ausnahme throw der Lage sein, es zu fangen:

try 
{ 
    try 
    { 
     var zero = 0; 
     var s = 2/zero; 
    } 
    catch (DivideByZeroException ex) 
    { 
     // catch and convert exception 
     throw new CustomException("Divide by Zero!!!!"); 
    } 
} 
catch (CustomException ex) 
{ 
    Console.Write("Exception"); 
    Console.ReadKey(); 
} 
+15

Sie möchten vielleicht erwähnen, dass es eine schreckliche Idee ist, dies zu tun. – Wilbert

+2

@Wilbert welcher Teil? '2/zero 'ist wahrscheinlich der einfachste Weg, eine sehr spezifische Ausnahme zu erhalten (' ((string) (null)). Length kann deutlicher aussehen "Beispielcode - nicht kopieren"); Das erneute Auslösen einer anderen Ausnahme ist ziemlich normal, wenn eine Operation auf hoher Ebene aufgrund einer der vielen verschiedenen Ausnahmen fehlschlägt ('IOException',' KeyNotFoundException' und like können als 'CustomerNotFoundException' erneut geworfen werden, vielleicht mit InnerException auf diese Ausnahme oder vielleicht nicht wegen Sicherheitsanforderungen); hoffentlich ist klar, dass das verschachtelte 'try' /' catch' nur ein Beispiel ist. –

+0

Ja, mit diesem Kontext macht es Sinn, aber nur das Code-Beispiel .. gut :) – Wilbert

16

Vor allem, wenn Sie Ihre eigene Ausnahme zu sehen, können Sie es irgendwo im Code throw sollte:

public static int DivideBy(this int x, int y) 
{ 
    if (y == 0) 
    { 
     throw new CustomException("divide by zero"); 
    } 

    return x/y; 

} 

dann:

int a = 5; 
int b = 0; 
try 
{ 
     a.DivideBy(b); 
} 
catch(CustomException) 
{ 
//.... 
} 
Verwandte Themen