2013-07-05 1 views
0

C#에서 ASP.NET 응용 프로그램을 작성하고 있으며 다른 파일에서 발생할 수있는 가능한 예외를 처리하기 위해 노력하고 있습니다. SQL 명령을 실행하는 메서드를 포함하는 C# 클래스 파일이 있는데 응용 프로그램이 제작되면 예외가 발생하지 않도록 보호하려고합니다. 다음과 같은 라인을 파일별도의 클래스 파일에서 ASP.NET (C#)의 예외 처리

public SqlConnection openConnection() 
{ 
     //Create an SQL connection 
     SqlConnection myConnection = new SqlConnection("My intentionally incorrect connection string"); 

     //Open the connection 
     try 
     { 
      myConnection.Open(); 
     } 
     catch (SqlException myAppEx) 
     { 
      throw new ApplicationException("There was an error opening the SQL database connection", myAppEx); 
     } 

     return myConnection; 
    } 

내하여 default.aspx.cs에서이 메소드를 호출

내가 의도적으로 (SqlData.cs에서)에서 오류를 던지고 오전 쓴 SQL 방법입니다 코드 :

try 
{ 
    //The ReadDT method calls openConnection() in itself 
    dt = sqlData.ReadDT(query); 
} 
catch (ApplicationException exc) 
{ 
    throw exc; 
} 

나는 예외가 현재 페이지에서 발생할 경우 here 인용으로의 Page_Error 방법은, 호출하도록되어 페이지 레벨의 예외 처리를 구현하기 위해 노력하고 있습니다. 그래서 내 SqlData.cs 클래스 파일에서 throw 된 예외를 catch하고 예외를 다시 throw하여이 예외가 서버에 표시되도록합니다. 따라서 Server.GetLastError()null을 반환하지 않습니다.

구현 된대로 here으로, 예외에 대한 모든 정보를 표시하는 별도의 오류 페이지가 있습니다.

private void Page_Error(object sender, EventArgs e) 
{ 
    Server.Transfer("ErrorPage.aspx?handler=Page_Error%20-%20Default.aspx", true); 
} 

는 여기에서 사용자는 내 ErrorPage.aspx로 리디렉션되고 원래 발생 된 SqlException은 (는) 도심에 표시됩니다 다음과 같이 내의 Page_Error 방법이다.

문제 - SqlData.cs에서 예외를 catch하고 예외를 다시 throw하면 UnhandledException이 발생합니다. ReadDT 메서드 호출에서 try catch 블록을 두지 않으면 SqlData.cs 파일에서 동일한 UnhandledException이 발생합니다.

코드 추적 : 그것은 모든이 실행하고 있어야 같이 Page_Error 메소드가 호출

    1. throw new ApplicationException("There was an error opening the SQL database connection", myAppEx); (이 제대로 작동) 예외는 다음 잡힌 재 던져 (UnhandledException가 발생)
    2. 정확히!

    나는 자신에게 대답하는 것이 분명해지기를 바란다. 나는 예외와 나의 특별한 문제에 대해 많은 연구를했으며 나는 대답을 찾지 못했다.

    감사합니다, ASP.NET에서 에릭

  • +0

    그래서 여기에 귀하의 전반적인 목표는 예외가 발생했을 때 사용자의 오류 페이지로 리디렉션됩니다 있는지 확인하는 것입니다? – Arran

    +0

    글로벌 파일에서'Application_Exception'은 어떻게됩니까? –

    +0

    Shekhar를 듣습니다. global.aspx 파일에 전역 예외 처리기가 있거나 호출 된 항목이 있습니다.이 코드를 사용하여 사용자 지정 오류 페이지로 리디렉션 할 수 있습니다 ... –

    답변

    0

    그래서 코드 레벨 예외 처리를 통해 오류 처리를 조합 한 다음 사용자를 오류 페이지로 리디렉션 한 다음 ELMAH로 오류를 기록하여 내 문제를 해결했습니다.

    이제 모든 예외를 SqlData 클래스 파일에서 직접 처리 할 수 ​​있습니다. 최소한 가장 효율적인 코드입니다. 내 SqlData 클래스 파일에 전역 변수 HttpResponse response이 있는데, 이는 내 ASP.NET 응용 프로그램 내에서 클래스의 새 인스턴스를 만들 때마다 채 웁니다. 내가 내 오류 페이지로 사용자를 보낼 내 클래스 파일에서 response.Redirect()를 호출 할 수 있어요 이렇게하면

    private SQLData data; 
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        data = new SQLData(Response); 
        ... 
    } 
    

    , 나는 예외 오류를 통과 : 그래서 내 Main.aspx.cs에서 내가 좋아하는 뭔가를 파일 메시지 및 예외 유형을 쿼리 문자열에 저장 한 다음 사용자에게 내 오류 페이지로 출력합니다. 이를 통해 민감하지 않은 정보 만 사용자에게 표시 할 수 있습니다. 따라서 예외가 처리되었으며 ELMAH가 모든 세부 사항을 기록했습니다!

    //Create an SQL connection 
    SqlConnection myConnection = new SqlConnection("MyConnString"); 
    
    //Open the connection 
    try 
    { 
        myConnection.Open(); 
    } 
    catch (Exception ex) 
    { 
        //Manually log the exception in ELMAH 
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
        //Redirect the user to the error page 
        response.Redirect("ErrorPage.aspx?ErrorMessage=" + ex.Message + "&ErrorType=SQLException", true); 
    } 
    
    return myConnection; 
    

    나는 다음 관리자 인 경우에만 elamh.axd 페이지 내 오류 페이지 연출의 하단에 링크 표시가 있습니다. 이 페이지에서 스택 추적 및 기타 중요한 정보를 볼 수 있습니다.

    this 페이지 하단의 ELMAH에 대한 정보는 물론, ASP.NET 응용 프로그램에서 ELMAH를 설정할 수도 있습니다. 그것은 매우 쉽게, 매우 강력한 도구입니다.

    건배, 에릭

    0

    는 응용 프로그램에 의해 던져진 처리되지 않은 예외는 페이지 또는 글로벌 오류 처리기를 호출하기 전에 HttpUnhandledException에 싸여됩니다. 원래 예외에서 처리하려면 해당 InnerException 속성을 살펴야합니다.

    일반적으로 값을 추가하지 않는 한 예외의 래핑 및 재 게시는 귀찮게하지 않아야합니다 (예 : 예외 상황에 대한 추가 데이터). 결국 페이지 처리마다 코드를 반복하지 않도록 global_asax.cs에서 Application_Error를 사용하는 것이 좋지만 최종적으로 처리되는 모든 페이지 (예 : Page_Error)로 전파 할 수 있습니다.

    +0

    나는 그것을 이해하지만'Page_Error' 또는'Application_Error' 핸들러에 도달하기 전에'UnhandledException'을 던지지 않도록하는 방법을 모른다. – Eric

    +0

    에러가 전파되는 것을 멈추고 싶다면'Server.ClearError()'를 호출 할 수는 있지만, 왜 그렇게하고 싶지는 모르겠다. Server.Transfer가 예상대로 작동하지 않습니까? – Joe

    +0

    오류를 잡아 내서'Default.aspx.cs' 파일에 다시 던지는 이유는 내 SqlData.cs 파일이 아니라 내 서버 파일에 예외를 던져야하기 때문입니다. 그렇지 않으면 Server.GetLastError ()'는'null '이됩니다. ASP 응용 프로그램에 관한 한 내 클래스 파일에서 예외가 throw되지 않습니다. – Eric