2013-07-17 21 views
34

Tôi muốn tạo Ngoại lệ tùy chỉnh trong C#, nhưng về mặt lý thuyết tôi cần thực hiện phân tích cú pháp nhỏ trước khi tôi có thể tạo Ngoại lệ có thể đọc được của con người.Đặt thông điệp của Ngoại lệ tùy chỉnh mà không chuyển nó tới hàm tạo cơ sở

Vấn đề là bạn chỉ có thể đặt Thông báo gốc bằng cách gọi hàm tạo cơ sở là Messsage, vì vậy tôi không thể thực hiện bất kỳ phân tích cú pháp nào trước.

tôi đã cố gắng overring Message bất động sản như thế này:

public class CustomException : Exception 
{ 
    string _Message; 

    public CustomException(dynamic json) : base("Plep") 
    { 
     // Some parsing to create a human readable message (simplified) 
     _Message = json.message; 
    } 

    public override string Message 
    { 
     get { return _Message; } 
    } 
} 

Vấn đề là rằng debugger Visual Studio vẫn thể hiện những thông điệp mà tôi đã vượt qua thành các nhà xây dựng, Plep trong trường hợp này.

throw new CustomException(new { message="Show this message" }) 

kết quả trong:

Visual Studio Exception Dialog

Nếu tôi rời khỏi nhà xây dựng cơ sở làm trống nó sẽ hiển thị một thông điệp rất chung chung:

Một ngoại lệ unhandled của loại 'App.CustomException' xảy ra trong App.exe

Câu hỏi

Dường như Hộp thoại ngoại lệ đọc một số trường/thuộc tính mà tôi không có bất kỳ quyền truy cập nào. Có cách nào khác để thiết lập một thông báo lỗi có thể đọc được của con người bên ngoài hàm tạo cơ sở trên Ngoại lệ hay không.

Lưu ý rằng tôi đang sử dụng Visual Studio 2012.

+0

Mã của bạn chỉ hoạt động tốt cho tôi. và nó có thể hoạt động. – Swift

+0

Nó biên dịch, nhưng nếu bạn ném một lỗi, nó sẽ hiển thị Thông báo cơ bản ("Plep"), thay vì "Hiển thị thông báo này". Vui lòng xem ví dụ bổ sung mà tôi đã thêm vào. –

+0

Tôi nghĩ rằng giải pháp lý tưởng không có sẵn. Tôi đã đi đến một vấn đề tương tự khi tôi phân tích cú pháp các lớp Exception wholoe thành JSON. Các thuộc tính tùy chỉnh bị mất trong tiến trình. Bạn có thể mô tả một kịch bản? Có lẽ chúng tôi có thể giúp giải quyết một số vấn đề. – Minduca

Trả lời

65

Chỉ cần đặt mã định dạng vào một phương pháp tĩnh?

public CustomException(dynamic json) : base(HumanReadable(json)) {} 
private static string HumanReadable(dynamic json) { 
    return whatever you need to; 
} 
+1

Hoàn hảo! Thậm chí không nhận thức được rằng bạn thực sự có thể gọi một phương thức tĩnh bên trong phần đối số của hàm tạo cơ sở! –

+1

Ah .. phải chờ 19 giờ trước khi tôi có thể trao cho bạn tiền thưởng. Khá mát mẻ mà thiết lập một tiền thưởng thực sự làm việc mặc dù;) –

11

Hãy xem xét các hướng dẫn của Microsoft để tạo ngoại lệ mới:

using System; 
    using System.Runtime.Serialization; 

    [Serializable] 
    public class CustomException : Exception 
    { 
    // 
    // For guidelines regarding the creation of new exception types, see 
    // https://msdn.microsoft.com/en-us/library/ms229064(v=vs.100).aspx 
    // 

    public CustomException() 
    { 
    } 

    public CustomException(string message) : base(message) 
    { 
    } 

    public CustomException(string message, Exception inner) : base(message, inner) 
    { 
    } 

    protected CustomException(SerializationInfo info, StreamingContext context) : base(info, context) 
    { 
    } 

    public static CustomException FromJson(dynamic json) 
    { 
     string text = ""; // parse from json here 

     return new CustomException(text); 
    } 
    } 

Lưu ý các phương thức tĩnh (không nằm trong mô hình), mà bạn có thể sử dụng trong chương trình của bạn như thế này:

throw CustomException.FromJson(variable); 

Bằng cách đó bạn đã thực hành tốt nhất và có thể phân tích cú pháp của bạn trong lớp ngoại lệ.

+5

Điều này sẽ hoạt động .. nhưng theo cách bạn vẫn đang làm việc xung quanh các tiêu chuẩn. Tôi chưa bao giờ ném một ngoại lệ bằng cách gọi một phương thức tĩnh - các ngoại lệ .NET mặc định cũng không có một phương thức tĩnh để gọi chúng. Tôi sẽ không làm điều này, bởi vì nó không phải là rất dễ phát hiện cho các lập trình viên khác. –

+2

Cả hai liên kết trong nhận xét đều bị hỏng. Liên kết mới: [Hướng dẫn thiết kế ngoại lệ] (https://msdn.microsoft.com/en-us/library/ms229014 (v = vs.100) .aspx) –

7

Tôi nghĩ rằng sự cố có thể xảy ra với trình gỡ lỗi Visual Studio. Tôi nhận được kết quả chính xác giống như bạn đã sử dụng trình gỡ lỗi, nhưng khi tôi in thư thay thế:

class CustomException : Exception { 
    public CustomException(dynamic json) 
     : base("Plep") { 
      _Message = json.message; 
    } 

    public override string Message { 
     get { return _Message; } 
    } 

    private string _Message; 
} 

class Program { 
    static void Main(string[] args) { 
     try { 
      throw new CustomException(new { message = "Show this message" }); 
     } catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

Tôi nhận được mong đợi "Show this message".

Nếu bạn đặt điểm ngắt nơi Ngoại lệ bị bắt, trình gỡ lỗi sẽ hiển thị cho bạn thông báo chính xác.

+1

Tôi biết, nhưng vấn đề thực sự là về hộp thoại mà trình gỡ lỗi Visual Studio cho thấy (xem ảnh chụp màn hình). Chỉ cảm thấy mệt mỏi (và nghĩ rằng nó là khá xấu xí) để liên tục nhìn vào ngoại lệ nội bộ hoặc các cách khác để xem tin nhắn gốc. –

0

Tôi thích sử dụng điều này tại đây. Rất dễ dàng và không cần chức năng tĩnh:

public class MyException : Exception 
{ 
    public MyException() : base("This is my Custom Exception Message") 
    { 
    } 
}