2012-04-23 4 views
1

허용 가능한 방식으로 예외를 처리하지 않는 전역 이벤트 관리자 클래스에 대한 싱글 톤 패턴을 사용하고 있습니다.싱글 톤 이벤트에 대한 예외 처리

실행중인 이벤트 중 하나가 호출하는 코드에서 예외가 발생하면 항상 Exception has been thrown by the target of an invocation. 오류가 발생합니다. 이 오류에는 원래 예외와 관련된 정보가 없어 오류를 디버그하는 것이 매우 어렵습니다.

원래 예외 정보를 다시 이벤트 관리자로 전달할 수있는 방법이 있습니까?

public class ApplicationSettings 
{ 
    private static EventManager _manager = new EventManager(); 

    public static EventManager EventManager 
    { 
     get { return _manager; } 
    } 
} 

이벤트 매니저 클래스 :

public class EventManager 
{ 
    public event EventHandler<ReportExecutionArgs> ExecuteReportCurrentPage; 
    public event EventHandler<ReportExecutionArgs> ExecuteReportNewPage; 

    public virtual void OnExecuteReportCurrentPage(object sender, ReportExecutionArgs e) 
    { 
     try 
     { 
      if (this.ExecuteReportCurrentPage != null) 
       this.ExecuteReportCurrentPage(sender, e); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

    public virtual void OnExecuteReportNewPage(object sender, ReportExecutionArgs e) 
    { 
     try 
     { 
      if (this.ExecuteReportNewPage != null) 
       this.ExecuteReportNewPage(sender, e); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
} 

몇 가지 다른 클래스는 이러한 이벤트

ApplicationSettings.EventManager.ExecuteReportNewPage += new EventHandler<ReportExecutionArgs>(reportOpenedNewPage); 

private void reportOpenedNewPage(object sender, ReportExecutionArgs e) 
    { 
     //something in this code throws an error 
     LitePage page = new LitePage(); 
     _tabs.AddPage(page); 
     Report report = setReport(page, e); 
    } 

편집

그냥 명확하게, try/catch 블록을에서 처리합니다 OnExecuteReport 메쏘드가 예외.

답변

1

TargetInvocationException과 같이 사용자가 설명하는 것과 같은 예외는 거의 항상 원래 예외 인 InnerException입니다.

+0

글쎄, 그게 너무 생각하지만, 나는 XML 오류 Linq을 받고 있었는지 알 수 있었지만 InnerException에서 참조되지 않습니다 – ChandlerPelhams

+0

좋아, 당신은 정확하지만, 당신이 돈을 경우에만 기분을 상하게하는 진술을 둘러싼 빈 catch 블록이 없습니다! : p – ChandlerPelhams

+0

빈 캐치 블록? 멸하다! –