2010-06-03 40 views
5

Đây là một hàm điển hình trả về giá trị đúng/sai;C# Có thể có kiểu trả về chung không?

private static bool hasValue() 
{ 
    return true; 
} 

Bây giờ trên một lỗi, tôi muốn trả lại đối tượng lỗi tùy chỉnh của riêng tôi với nét:

public class Failure 
    { 
     public string FailureDateTime { get; set; } 
     public string FailureReason { get; set; } 
    } 

tôi dự kiến ​​sẽ có để có thể ném đối tượng tùy chỉnh này ví dụ ...

private static bool hasValue() 
{ 
    try 
     { 
      ...do something 
     } 
    catch 
     { 
     throw new Failure(); 
     } 
    return true; 
} 

Điều này là không thể, và tôi không muốn lấy được lỗi từ System.IO.Exception vì bản thân tôi đã gặp sự cố khi sắp xếp các trường hợp ngoại lệ trong C# (Điều này với .net v2).

Giải pháp hay nhất hoặc lý tưởng nhất cho vấn đề này là gì. Tôi có nên làm việc với đối tượng tĩnh riêng không? Hoặc là có một cách sạch hơn để trả lại một đối tượng tùy chỉnh hoặc bỏ qua kiểu trả về điển hình trên một lỗi (không sử dụng System.IO.Exception)?

Tôi hoàn toàn không hoang mang về việc sử dụng một đối tượng, bởi vì sau đó tôi cần phải xác thực kết quả bằng cách sử dụng tính năng đúc và nhiều boolean hơn.

+0

Tôi nghĩ rằng điều duy nhất có thể được ném là cái gì đó xuất phát từ Ngoại lệ. – kenny

Trả lời

10

Loại giải pháp này có thể phù hợp với trường hợp này:

var exception = new Exception(); 
exception.Data.Add("Failure", new Failure()); 
throw exception; 

Bạn có thể ném ngoại lệ (khuyến khích để xác định loại ngoại lệ của riêng bạn), và sử dụng từ điển dữ liệu để giữ Failure. Trong mã catch, bạn có thể lấy dữ liệu và tuần tự hóa. Nếu bạn tạo loại ngoại lệ của riêng mình, bạn có thể đặt Lỗi trên thuộc tính.

Nhận xét: Tôi đã không kiểm tra, nhưng bạn có chắc chắn ngoại lệ không thể tuần tự hóa không?

+1

+1 Khá dễ thương. –

+0

Tôi nghĩ rằng tôi sẽ thực hiện giải pháp này, trông rất hứa hẹn. –

+0

Tôi đã gặp một số vấn đề về ngoại lệ trong thực tế. –

7

Tôi không muốn lấy được lỗi từ System.IO.Exception vì không thể tuần tự hóa ngoại lệ trong C#.

Giả định rằng câu hỏi này dựa trên là bạn không thể tuần tự hóa ngoại lệ bắt nguồn từ IOException. Tuy nhiên tôi muốn thách thức giả định này. IOException được đánh dấu là Serializable. Tất cả bạn phải làm là đánh dấu phân lớp của bạn như serializable quá.

Xem tài liệu cho IOException:

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public class IOException : SystemException 
6

Bạn cần phải xuất phát từ System.Exception (hoặc bất kỳ khác không sealed lớp con của nó) nếu bạn muốn tạo lớp ngoại lệ của riêng bạn. Không serialize mà bạn đang nói về có thể là một thực tế rằng bạn đã không thực hiện các nhà xây dựng serialization.

Visual Studio có đoạn mã tạo mẫu được đề xuất cho ngoại lệ lớp con. Bạn có thể nhận được bằng cách nhập exception và nhấn tab hai lần.

Đây là những gì đi ra:

[Serializable] 
public class MyException : Exception { 
    public MyException() { } 
    public MyException(string message) : base(message) { } 
    public MyException(string message, Exception inner) : base(message, inner) { } 
    protected MyException(
     System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) { } 
} 
0

Đừng lo lắng quá nhiều về tình huống này; chỉ cần tạo một loại kết quả để đóng gói tất cả logic này.

public class ValueResult 
{ 
    public Failure FailureDetails {get;set;} 
    public bool Success {get;set;} 
    public bool HasValue {get;set;} 
    public object Value {get;set;} 
} 

var result = HasValue(); 
if(result.Success) 
    DoSomething(result.Value); 
else if(!result.Success) 
    LogFailure(result.FailureDetails); 
+1

... và bạn có được tất cả sự thanh lịch và mạnh mẽ của lập trình với mã lỗi kiểu C ... làm thế nào để bạn cho người gọi của người gọi biết và xử lý lỗi? –

+0

Ít nhất là làm cho nó chung chung, thay vì sử dụng một đối tượng đơn giản. – harms

+0

@harms Giá trị là bất kỳ điều gì anh ta muốn; giải pháp không phải là một lớp chung để được sử dụng trong mọi tình huống (không cần phải thay thế xử lý ngoại lệ), chỉ là một tùy chọn khác cho quesiton của mình. Vì vậy, nếu giá trị nên là một MintyGreenChocolate ông chỉ đơn giản có thể chuyển đổi mà ra cho đối tượng. – Will

1

Inerit từ ngoại lệ và làm cho đối tượng của bạn serializable

0

Bạn phải thực hiện một lớp kế thừa từ ngoại lệ như thế này:

[Serializable] 
public class Failure: Exception 
{ 
    public string ErrorMessage 
    { 
     get 
     { 
     return base.Message.ToString(); 
     } 
    } 

} 

và sau đó

catch(Exception ex) 
{ 
    throw new Failure(
      "exception message here", ex.messege); 
} 
0

Ngoài ra bạn luôn có thể sử dụng Thư viện Doanh nghiệp Xử lý ngoại lệ cho trường hợp ngoại lệ tùy chỉnh cung cấp lớp của riêng bạn để xử lý ngoại lệ, định dạng loại, khai thác gỗ vv ...

try 
{ 
} 
catch(Exception ex) 
{ 
    bool rethrow = ExceptionPolicy.HandleException(ex, "My Custom Policy"); 
    if (rethrow) 
    { 
     throw; 
    } 
} 
finally 
{ 
} 

Ví dụ:

http://weblogs.asp.net/sukumarraju/archive/2009/10/04/microsoft-enterprise-library-4-1-exception-handling-block.aspx

http://www.imason.com/imason_Blogs/b/suleman_ibrahim/archive/2009/05/25/configuring-enterprise-library-4-0-for-exception-handling-and-logging.aspx

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