2013-04-13 18 views
19

Próbuję zaimplementować własną klasę wyjątków w języku C#. W tym celu utworzyłem klasę CustomException wywodzącą się z Exception.Zwracanie niestandardowego wyjątku

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) { } 
} 

Następnie używam go

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

Czekam otrzymam wyjątek ale mam to standard DivideByZeroException. Jak mogę złapać wyjątek dzielenia przez zero przy użyciu mojej klasy CustomException? Dzięki.

+10

Dlaczego .NET zacząć korzystać z wyjątku? Musisz ['throw'] (http://msdn.microsoft.com/en-us/library/1ah5wsex (v = vs.110) .aspx) sam. –

+0

ok, nawet jeśli dodam nowy wyrzutek, aby złapać sekcję, nie dostanę. Nadal będę otrzymywać wyjątek standartowy. Czy muszę napisać kod w moim wyjątku CustomException, aby złapać wyjątki DevideByZero? – JohnyMotorhead

+0

Nie powinieneś, jeśli rzuciłeś _befce_dla o zero lub używasz podejścia Aleksieja. Przy okazji: myślę, że nie jest dobrą praktyką zastępowanie wyjątków, chyba że masz bardzo dobre powody. –

Odpowiedz

26

Nie można magicznie zmienić typu wyjątku zgłaszanego przez istniejący kod.

Trzeba throw swój wyjątek, aby móc go złapać:

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

Możesz wspomnieć, że jest to okropny pomysł, aby to zrobić. – Wilbert

+2

@ Weilbert which part? '2/zero' jest prawdopodobnie najłatwiejszym sposobem uzyskania bardzo specyficznego wyjątku (' ((string) (null)). Length 'może wyglądać bardziej wyraźnie "przykładowy kod - nie kopiuj"); ponowne rzucanie różnych wyjątków jest dość standardową praktyką, gdy niektóre operacje na wysokim poziomie kończą się niepowodzeniem z powodu jednego z wielu różnych wyjątków ('Wyjątek IOE',' KeyNotFoundException' i podobne mogą być ponownie wyrzucane jako 'CustomerNotFoundException', może z InnerException ustawionym na ten wyjątek, lub może nie ze względu na wymogi bezpieczeństwa); miejmy nadzieję, że jest jasne, że zagnieżdżone 'try' /' catch' jest po prostu próbką. –

+0

Tak, z tym kontekstem ma sens, ale po prostu próbka kodu .. dobrze :) – Wilbert

16

Przede wszystkim, jeśli chcesz zobaczyć swój własny wyjątek, należy go throw gdzieś w kodzie:

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

    return x/y; 

} 

następnie:

int a = 5; 
int b = 0; 
try 
{ 
     a.DivideBy(b); 
} 
catch(CustomException) 
{ 
//.... 
} 
Powiązane problemy