tôi thấy mình gặp rất nhiều về điều này trong các phương pháp khác nhau trong mã của tôi:Sử dụng một lớp chung để thực thi với try/catch/finally?
try
{
runABunchOfMethods();
}
catch (Exception ex)
{
logger.Log(ex);
}
gì về việc tạo này:
public static class Executor
{
private static ILogger logger;
public delegate void ExecuteThis();
static Executor()
{
// logger = ...GetLoggerFromIoC();
}
public static void Execute<T>(ExecuteThis executeThis)
where T : Exception
{
try
{
executeThis();
}
catch (T ex)
{
// Some kind of Exception Handling Strategy...
logger.Log(ex);
// throw;
}
}
}
Và chỉ sử dụng nó như thế này:
private void RunSomething()
{
Method1(someClassVar);
Method2(someOtherClassVar);
}
...
Executor.Execute<ApplicationException>(RunSomething);
Có bất kỳ nhược điểm nào đối với phương pháp này không? (Bạn có thể thêm Executor-phương pháp và đại biểu khi bạn muốn có một cuối cùng và sử dụng generics cho các loại Exeception bạn muốn bắt ...)
Edit: Xin lỗi vì không rõ ràng - những gì tôi đã thực sự sau là một số đầu vào vào ý tưởng chung của việc cố gắng di chuyển việc thực thi mã từ lớp được đề cập đến một lớp tổng quát hơn thực hiện điều này. Tôi chỉ thực hiện một giải pháp nhanh chóng nhưng thực tế bạn sẽ sử dụng những thứ như chiến lược xử lý ngoại lệ, các lớp cơ sở thực thi trừu tượng với các lớp thực thi chuyên biệt hơn cho một lớp/phần cụ thể của hệ thống. Tôi thường tạo một phương thức với try .../runABunchOfMethods-part (điều này xử lý ngoại lệ, với các ngoại lệ đặc biệt) gọi runABunchOfMethods để thực thi một tập hợp hạn chế các kiểu "clean code" khác.
Tôi sẽ mua đối số obfuscation ở một số cấp nhưng nếu toàn bộ giải pháp/kiến trúc thực hiện phương pháp được đề xuất này thì lập trình mới sẽ có thể hiểu được mẫu.
Tôi đã chỉnh sửa Executor để bao gồm một T chung để cho phép mã gọi để chỉ định các exeception chỉ để hiển thị như thế nào để xử lý một exeception chuyên ngành. Trong các trường hợp khác, bạn có thể có một loạt các catch: es tùy thuộc vào những gì bạn muốn làm nhưng đó là những trường hợp đặc biệt trong các lớp con cụ thể tôi đã nói về.
Đẹp! Đó là chính xác những gì tôi đang tìm kiếm - và sử dụng các thuộc tính trên các phương thức của bạn đẹp hơn nhiều so với Executer.Execute (delegate) -stuff. Có vẻ như tôi không xa câu trả lời như mọi người nghĩ ... :) Ai cũng biết về bất kỳ Khung AOP nào khác có hỗ trợ Xử lý ngoại lệ theo phong cách AOP? (Để so sánh ...) – antirysm
Hoặc, thay vì PostSharp, sử dụng khung tiêm phụ thuộc, hầu hết trong số đó cho phép chặn động các cuộc gọi phương thức. –