2012-02-17 4 views
0

1) 페이지 클래스에서 상속 한 PageBase 클래스가 있습니다. 모든 코드는 PageBase 클래스에서 상속받습니다. 그래서 예외 처리 로직을 PageBase 클래스에 추가하려고합니다.PageBase ASP.NET 웹 양식의 예외 처리?

Page_Error 이벤트에서 예외를 처리하는 논리를 추가했지만 웹 페이지의 맨 위에 예외 정보가 올바르게 표시되도록 페이지를 올바르게 표시하려고합니다. 웹 양식에

예컨대

나는 데이터베이스에서 데이터를 업데이트 버튼을 제어 할 수 있습니다. 버튼을 클릭하면 데이터를 업데이트하는 논리가 있습니다. 그것을 업데이트하는 동안 예외가 발생할 수 있습니다. 나 버튼을 클릭 로직을 저장 클릭 catch 블록을 넣어 싶지 않아. 대신 일부 메서드 또는 이벤트를 PageBase 예외를 catch하고 머리글에서 모든 컨트롤 및 예외 페이지를 완전히 렌더링 할.

2)`// 코드 숨김 페이지의 기본 클래스에서, 나는 내가 버튼을 클릭 이벤트

Private List<T> GetData(string a, string b) 
{ 
    List<T> _lst; 
    TryAction(()=>{ 
    //Call BLL Method to retrieve the list of BO. 
    _lst = BLLInstance.GetAllList(a,b); 
    }); 
    return _lst; 
} 

이 잘 작동에 대한 코드를 작성했습니다 코드 숨김에서

protected void TryAction(Action action) 
{ 
    try 
    { 
    action(); 
    } 
    catch(Exception e) 
    { 
    // write exception to output (Response.Write(str)) 
    } 
} 

을 작성했습니다 원하는,

Private List<T> GetData(string a, string b) 
{ 
    TryAction(()=>{ 
    //Call BLL Method to retrieve the list of BO. 
    return BLLInstance.GetAllList(a,b); 
    }); 
} 

"System.Action retuens void"오류를 표시하고 있습니다, 어떻게하면 우리에게 말해 줄 수 있습니까? e TryAction 반환 형식이있는 경우 메서드입니다.

답변

1

예외가 발생하면 catch하지 않으면 Page_Error 및 Application_Error가 표시됩니다. Page_Error가되면 페이지 렌더링이 이미 망가져 있습니다. 페이지의 나머지 부분을 렌더링하는 방법이 있다고 생각하지 않습니다. 오류 처리 로직의 코드 재사용을 늘리려는 경우 익명 메소드를 사용할 수 있습니다.

// on your base page 
protected void TryAction(Action action) 
{ 
    try 
    { 
     action(); 
    } 
    catch(Exception e) 
    { 
     // write exception to output (Response.Write(str)) 
    } 
} 

protected void TryFunction<T>(Function<T> func) 
{ 
    try 
    { 
     return func(); 
    } 
    catch(Exception e) 
    { 
     // write exception to output (Response.Write(str)) 

     return default(T);// have to return something now because it's a function. 
    } 
} 

다음 데이터 액세스 방법은 예외 함수에서 발생하는 경우 다시에서 유용한 값을 얻을 수 있으며 그에 따라 코드를해야 주목할 필요가있다

protected void Button1_Click(object sender, EventArgs e) 
{ 
    TryAction(() => { 
     // Do stuff here - save to database etc 
    }); 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    return TryFunction<string>(() => { 
     // Do stuff here - save to database etc 
     return "woo"; 
    }); 
} 

처럼 보일 수 있습니다.

+0

Page_Error로 버블 링되기 전에 어떤 방식 으로든 페이지를 렌더링하고 나머지 렌더링을 계속할 수 있습니다. HttpModules 또는 Handler 구현과 같은 것이 있습니까? – Pravin

+0

내가 여기에 당신에게 준 스 니펫은 버튼 클릭 핸들러 안에서 잡을 것입니다. – SynXsiS

+0

모든 코드 숨김 파일에 스 니펫을 포함해야합니다. 대신 뭔가 내가 HttpModules 및 HttpHandlers 구현하여 pagebase있는 일부 메서드를 추가 할 수 있습니까? – Pravin

1

예외를 catch하고 계속하지 마십시오. 그렇다고해서 결코 예외 정보를 사용자에게 표시하지 않는 것이 거의 불가능합니다. 이러한 오류의 기술적 특성으로 인해 정보 유출 문제가 발생하며 이는 보안 문제입니다.

대신 사용자 지정 오류 메시지 RemoteOnly을 표시하도록 응용 프로그램을 구성하고 로깅 프레임 워크를 사용하여 예외를 기록하십시오. ELMAH는이를위한 훌륭한 틀입니다. NuGet에서 다운로드하십시오.

+0

신청서는 기술 담당자가 처리합니다. 양식에 데이터를 입력하는 약 20 개의 필드가 있습니다. 그는 고유 한 키 제한으로 인해 예외를 던질 수있는 업데이트 버튼을 클릭 할 때 20 개의 필드를 입력하고 예외 메시지를보고 다시 고유 필드에 적절한 데이터를 입력합니다. 알려 주시기 바랍니다. – Pravin

+0

사용자가 실수 할 수있는 것에 대한 예외를 throw하지 않습니다. 데이터의 유효성을 검사하십시오. 예를 들어 DataAnnotations를 사용할 수 있습니다. – Steven