2013-04-13 3 views
19

Я пытаюсь реализовать свой собственный класс исключения на C#. Для этого я создал класс CustomException, полученный из Exception.Возврат специального исключения

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

Затем я использую его

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

Я ожидаю, что я получу исключение, но все это я получаю стандартный DivideByZeroException. Как я могу поймать деление на нулевое исключение, используя мой класс CustomException? Благодарю.

+10

Почему .NET начать использовать исключение? Вы должны ['throw'] (http://msdn.microsoft.com/en-us/library/1ah5wsex (v = vs.110) .aspx) сами. –

+0

в порядке, даже если я добавлю бросить новое исключение, чтобы поймать раздел, я не получу его. Я по-прежнему получаю стандартное исключение. Нужно ли мне писать код в моем CustomException, чтобы поймать исключения DevideByZero? – JohnyMotorhead

+0

Вы не должны, если вы бросаете _before_ div на ноль или используете подход Алексея. Кстати: я считаю, что не стоит заменять исключения, если у вас нет веских оснований. –

ответ

26

Вы не можете магически изменить тип исключения, созданного существующим кодом.

Вы должны throw ваше исключение, чтобы быть в состоянии поймать его:

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

Возможно, вы захотите упомянуть, что это ужасная идея. – Wilbert

+2

@Wilbert какая часть? '2/zero', вероятно, самый простой способ получить очень специфическое исключение (' ((string) (null)). Length' может выглядеть более явно «пример кода - не копировать»); повторное бросание разных исключений - довольно стандартная практика, когда некоторая операция высокого уровня терпит неудачу из-за одного из многих различных исключений ('IOException',' KeyNotFoundException' и т. д., может быть повторно выбрано как 'CustomerNotFoundException', возможно, с InnerException, установленным для этого исключения, или возможно, не из-за требований безопасности); надеюсь, ясно, что вложенный 'try' /' catch' является просто образцом. –

+0

Да, с этим контекстом это имеет смысл, но просто образец кода .. ну :) – Wilbert

16

Прежде всего, если вы хотите видеть свое исключение, вы должны throw его где-нибудь в вашем коде:

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

    return x/y; 

} 

затем:

int a = 5; 
int b = 0; 
try 
{ 
     a.DivideBy(b); 
} 
catch(CustomException) 
{ 
//.... 
} 
Смежные вопросы