2010-03-08 41 views
5

Trong dịch vụ của tôi tất cả các phương pháp tiếp xúc có:Làm thế nào để khai thác gỗ trong C#?

try 
{ 
    // the method core is written here 
} 
catch(Exception ex) 
{ 
    Log.Append(ex); 
} 

Đó là nhàm chán và xấu xí để lặp lại nó hơn và hơn nữa. Có cách nào để tránh điều đó không? Có cách nào tốt hơn để giữ cho dịch vụ hoạt động ngay cả khi trường hợp ngoại lệ xảy ra và tiếp tục gửi các chi tiết ngoại lệ cho lớp Log?

+0

Bạn có nghĩa là loại dịch vụ nào? WCF, asmx, cửa sổ dịch vụ? – empi

+0

@empi tự lưu trữ WCF –

Trả lời

4

Bạn có thể thiết lập một phương pháp xử lý lỗi chung cho tất cả các trường hợp ngoại lệ còn tự do như vậy:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException); 

Tùy thuộc vào những gì đã xảy ra, bạn có thể không có khả năng khắc phục lỗi ... nhưng điều này nên hy vọng cung cấp cho bạn một số ý tưởng về những gì đã xảy ra. Nếu nó đến điểm mà mã ứng dụng của bạn đã không xử lý ngoại lệ một cách duyên dáng, phương thức này có thể cố gắng khởi tạo lại dịch vụ cho một trạng thái làm việc đã biết.

5

Hãy thử AOP. Đây là điểm bán hàng được sử dụng rộng rãi nhất của AOP.

Ngoài ra, hãy xem this discussion tại đây trên SO.

+0

chờ, ví dụ trong bài đăng trên blog bạn đã chỉ không xóa 'try-catch'. Nó chỉ tái cấu trúc dòng 'Log.Append', đúng không? –

+0

Với lập trình hướng khía cạnh, bạn tiếp cận mọi thứ khác nhau. Nhìn vào phần giới thiệu của PostSharp cho một ý tưởng - http://www.sharpcrafters.com/postsharp/documentation/getting-started - bằng cách đó bạn không sử dụng try/catch etc để ghi nhật ký, bạn sẽ sử dụng một thuộc tính. Rõ ràng bạn vẫn sẽ cần thử/cuối cùng để làm sạch mã vv. BTW, liên kết postsharp là một ví dụ - tôi không nói giải pháp của nó mà bạn cần. –

1

Tôi đã từng sử dụng một cái gì đó như Mẫu chức năng mẫu để giải quyết vấn đề như thế này. Tôi có một lớp cơ sở đã thực hiện một việc như sau:

public void Execute() 
{ 
    try 
    { 
     ExecuteImplementation(); 
    } 
    catch (Exception ex) 
    { 
     // Log ex 
    } 
} 

public abstract void ExecuteImplementation(); 

Có một lớp học có nguồn gốc cho mỗi hoạt động dịch vụ web. Các lớp dẫn xuất từng thực thi ExecuteImplementation.

Các hoạt động dịch vụ web đã làm:

[WebMethod] 
public Result WebOperation(Request request) 
{ 
    WebOperationClass instance = new WebOperationClass(request); 
    instance.Execute(); 
    return instance.Result; 
} 
+0

Giải pháp của bạn lấy cảm hứng từ chính tôi, mà tôi đã đăng ở đây dưới dạng câu trả lời –

4

tôi đã đưa ra một giải pháp bán ngay bây giờ. Tôi có thể cấu trúc mã:

public TResult ExecuteAndLogOnError(Func<TResult> func) 
{ 
    try 
    { 
     return func(); 
    } 
    catch(Exception ex) 
    { 
     // logging ... 
    } 
} 

Và sau đó bạn có thể gọi nó trên mỗi phương pháp:

return ExecuteAndLogOnError(() => 
{ 
    // method core goes here.. 
}); 

Đó là 4 dòng ngắn hơn so với kịch bản gốc.

+2

Có thể xảy ra là nó sẽ dẫn đến việc đóng cửa không cần thiết. – empi

+0

@empi đóng cửa là gì? –

+2

câu hỏi này khó hơn câu hỏi đầu tiên của bạn;) http://blogs.msdn.com/ericlippert/archive/2003/09/17/53028.aspx – empi

2

Nếu tất cả những gì bạn đang làm là ghi nhật ký thì chỉ cần đăng nhập lỗi ở giai đoạn sau ... Không cần phải ghi nhật ký lỗi sớm. Nếu bạn làm nhiều hơn là đăng nhập lỗi, thì bạn sẽ cần try..catch anyway. Và nếu bạn nuốt các ngoại lệ (IE. Chỉ cần đăng nhập chúng và sau đó tiếp tục như thể những điều không xảy ra) thì có thể bạn đang làm sai ...

3

Trong trường hợp này, tôi luôn sử dụng các trình xử lý lỗi tập trung. Trong WCF nó rất dễ dàng. Một số chi tiết khác: http://www.haveyougotwoods.com/archive/2009/06/24/creating-a-global-error-handler-in-wcf.aspx

Về cơ bản, bạn chỉ cần triển khai giao diện IServiceBehavior và sau đó cung cấp trình xử lý lỗi của riêng bạn. Đó là cách tốt nhất để làm điều này bởi vì bạn không phải viết bất kỳ mã nào xử lý các ngoại lệ chết người (tôi có nghĩa là các ngoại lệ mà bạn chỉ có thể đăng nhập và bạn không biết phải làm gì với chúng) trong các phương thức của bạn.

1

Bộ lọc ngoại lệ sẽ tốt cho việc này. Tuy nhiên, .NET hỗ trợ chúng thông qua MSIL, C++/CLI, VB.NET, nhưng không hỗ trợ C#.

+0

wow, không bao giờ nghe nói về một tính năng MSIL bị thiếu trong C# –

+0

Thực ra có một số ít. Các cuộc gọi không ảo đến các phương thức khác với lớp cơ sở sẽ là một ví dụ khác. Các hàm tạo tham số cho các kiểu giá trị. Generic hiệp phương sai có sẵn trong thời gian chạy một phiên bản chính trước khi C# nhặt nó lên (thực sự tôi đoán C# hỗ trợ vẫn còn trong phiên bản beta). –

1

Nếu tất cả những gì bạn đang thực hiện là ghi ngoại lệ, bạn có thể chỉ cần sử dụng trang lỗi tùy chỉnh và để ELMAH ghi lại tất cả các trường hợp ngoại lệ chưa được nắm bắt của bạn.

+0

Tôi không sử dụng ASP.NET hoặc IIS trong dự án này –

0

Một áp phích trước đã đưa lên AOP (Lập trình hướng Aspecte).

Tôi sử dụng PostSharp cho các dấu vết/ngoại lệ đăng nhập cơ bản.

Rất dễ sử dụng và thiết lập.

Kiểm tra liên kết này và xem hướng dẫn.

http://www.sharpcrafters.com/postsharp

--crap nó không còn nguồn mở ... anyways bạn có thể lấy Postsharp1.5 và lộn xộn xung quanh với nó để xem nếu nó là một cái gì đó bạn quan tâm đến nó.

Tôi cũng không có cách nào liên kết với PostSharp. Tôi chỉ là một người dùng.

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