Tôi muốn bắt bất kỳ trường hợp ngoại lệ từ phương pháp nào trong một lớp học để tôi có thể ghi lại các dữ liệu cụ thể lớp học để các ngoại lệ đối với khai thác gỗ trước khi nó được chuyển lên stack. Tôi biết rằng tôi có thể đặt một thử-catch trong mọi phương pháp của lớp, nhưng có rất nhiều phương pháp và có vẻ như có nên có một cách hiệu quả hơn.
Ví dụ về những gì tôi hiện đang thực hiện:
public class ClassA
{
private int x;
private int y;
public void Method1()
{
try
{
//Some code
}
catch(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public void Method2()
{
try
{
//Some code
}
catch (Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
}
Ví dụ về những gì tôi muốn làm:
public class ClassB : IUnhandledErrorHandler
{
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
void IUnhandledErrorHandler.OnError(Exception ex)
{
ex.Data.Add("x", x);
ex.Data.Add("y", y);
throw;
}
}
public interface IUnhandledErrorHandler
{
void OnError(Exception ex);
}
Lưu ý: Lớp này là một dịch vụ trong một dự án WCF và triển khai ServiceContract. Tôi đã thử thêm một ErrorHandler vào ChannelDispatcher của dịch vụ. Tuy nhiên, khi lỗi đến ErrorHandler nó đã vượt quá phạm vi của lớp nơi xảy ra lỗi, vì vậy tôi không thể truy cập các chi tiết lớp học.
Giải pháp:
public class ClassC
{
public ClassC()
{
AppDomain.CurrentDomain.FirstChanceException += OnError;
}
private int x;
private int y;
public void Method1()
{
//Some code
}
public void Method2()
{
//Some code
}
private void OnError(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
e.Exception.Data["x"] = x;
e.Exception.Data["y"] = y;
}
}
Đây có phải là chỉ để gỡ lỗi không? Bạn có muốn gửi ngoại lệ cho khách hàng hay chỉ giữ chúng ở bên máy chủ không? –
của nó để gỡ lỗi/đăng nhập ở phía máy chủ. – KowalskiTom
Bạn không bao giờ nên sử dụng "throw ex;". Điều đó làm cho nó trông giống như ngoại lệ ban đầu đến từ vị trí của "ném cũ;". –