2012-12-28 28 views
5

Tôi muốn xác định một ngoại lệ tùy chỉnh và tôi muốn biết liệu tôi có thể bao gồm một lớp thay vì chuỗi làm thông báo hay không. Lý do là tôi muốn gửi thêm thông tin trong một cấu trúc có thể linh hoạt hơn.Tôi có thể đưa một đối tượng mang thông tin bổ sung vào ngoại lệ không?

+2

"Ném một lớp thay vì một chuỗi" ??? Từ khóa ném luôn ném ra một ngoại lệ là một lớp Vì vậy, bạn luôn luôn ném một lớp .. – nitgeek

Trả lời

16

Có. Chỉ cần tạo một lớp kế thừa từ Ngoại lệ.

class YourException : Exception 
{ 
    public YourException(SpecialObject thethingYouWantIncluded) 
    { 
     ExtraObject = thethingYouWantIncluded; 
    } 

    public SpecialObject ExtraObject { get; private set; } 
} 

sau đó

throw new YourException(new SpecialObject()); 

catch (YourException ex) { /* do something with ex.ExtraObject here */ } 
6

Có bạn có thể, loại.

Trong C#, tất cả ngoại lệ là các lớp, chúng là các trường hợp của System.Exception hoặc một số lớp bắt nguồn từ đó. Nếu bạn muốn tạo ngoại lệ tùy chỉnh, bạn chỉ cần xác định một lớp mới kế thừa từ Exception.

Trong lớp tùy chỉnh này, bạn có thể thêm bất cứ điều gì thuộc tính bổ sung, các lĩnh vực, vv mà bạn muốn:

public class CustomException : Exception 
{ 
    public Object CustomThing { get; set; } 
} 

Khi bạn bắt như một ngoại lệ vào một biến kiểu CustomException bạn sẽ có quyền truy cập vào tất cả các các thuộc tính tùy chỉnh mà bạn đã xác định, giống như bất kỳ lớp nào khác.

Tuy nhiên, những gì bạn không thể làm là thay đổi thực tế là Exception.Message là một chuỗi. Lớp thông báo tùy chỉnh của bạn sẽ có thuộc tính Message và nó sẽ là string và bạn không thể thay đổi nó. Bạn sẽ cần phải xác định một chuỗi tùy chỉnh bao gồm tất cả các thông tin có liên quan. Bạn có thể ghi đè thuộc tính Message để trả lại thông tin từ thuộc tính tùy chỉnh của mình, nhưng nó vẫn cần phải là một chuỗi:

public class CustomException : Exception 
{ 
    public override string Message 
    { 
     get 
     { 
      if (this.CustomThing == null) 
      { 
       return base.Message; 
      } 
      else 
      { 
       return string.Format("Custom thing: {0}", this.CustomThing); 
      } 
     } 
    } 
} 
+0

+1 để đề cập: "Tuy nhiên, những gì bạn không thể làm là thay đổi thực tế là Exception.Message là một chuỗi." – hometoast

Các vấn đề liên quan