2013-04-13 32 views
19

Tôi đang cố gắng triển khai lớp Ngoại lệ của riêng mình trong C#. Với mục đích này, tôi đã tạo ra một lớp CustomException bắt nguồn từ Ngoại lệ.Trả lại ngoại lệ tùy chỉnh

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

Sau đó, tôi sử dụng nó

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

tôi hy vọng tôi sẽ nhận được ngoại lệ của tôi, nhưng tất cả tôi nhận được là một DivideByZeroException chuẩn. Làm thế nào tôi có thể bắt một phân chia bằng không ngoại lệ bằng cách sử dụng lớp CustomException của tôi? Cảm ơn.

+10

Tại sao .NET nên bắt đầu sử dụng ngoại lệ của bạn? Bạn phải ['ném'] (http://msdn.microsoft.com/en-us/library/1ah5wsex (v = vs.110) .aspx) bản thân bạn. –

+0

okay, ngay cả khi tôi thêm ném Ngoại lệ mới vào phần bắt, tôi sẽ không nhận được nó. Tôi sẽ tiếp tục nhận được ngoại lệ standart. Tôi có cần phải viết một số mã trong CustomException của mình để bắt ngoại lệ DevideByZero không? – JohnyMotorhead

+0

Bạn không nên nếu bạn ném _before_ div bằng 0 hoặc sử dụng cách tiếp cận của Alexei. Nhân tiện: Tôi nghĩ việc thay thế các trường hợp ngoại lệ là không tốt nếu bạn không có lý do chính đáng. –

Trả lời

26

Bạn không thể thay đổi loại ngoại lệ một cách kỳ diệu bằng mã hiện có.

Bạn cần phải throw ngoại trừ của bạn để có thể bắt nó:

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

Bạn có thể muốn đề cập đến rằng đó là một ý tưởng khủng khiếp để làm điều này. – Wilbert

+2

@Wilbert là phần nào? '2/zero' có lẽ là cách dễ nhất để có ngoại lệ rất cụ thể (' ((string) (null)). Length' có thể trông rõ ràng hơn "mã mẫu - không sao chép"); việc ném lại ngoại lệ khác nhau là thực hành khá chuẩn khi một số thao tác mức cao không thành công do một trong nhiều ngoại lệ khác nhau ('IOException',' KeyNotFoundException' và có thể được ném lại thành 'CustomerNotFoundException', có thể với InnerException được đặt thành ngoại lệ đó, hoặc có thể không phải do yêu cầu bảo mật); hy vọng rõ ràng là 'try' /' catch' lồng nhau chỉ là một mẫu. –

+0

Vâng, với bối cảnh đó nó có ý nghĩa, nhưng chỉ là mẫu mã .. tốt :) – Wilbert

16

Trước hết, nếu bạn muốn xem ngoại lệ của riêng bạn, bạn nên throw nó ở đâu đó trong mã của bạn:

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

    return x/y; 

} 

rồi:

int a = 5; 
int b = 0; 
try 
{ 
     a.DivideBy(b); 
} 
catch(CustomException) 
{ 
//.... 
} 
Các vấn đề liên quan