2010-05-05 5 views
3

최근에 VB6 앱을 VB.Net으로 마이그레이션했습니다. 전체 VB6 종속성이 제거됩니다. 그리고 코드가 단일 모듈에 대해서만 잘 작동한다는 것은 WinApp처럼 잘 작동하고 있다는 것을 의미합니다.더 나은 방법으로 오류 처리

내 요구 사항이 변경되었습니다. 이제 동일한 클래스가 여러 응용 프로그램에 의해 액세스 될 수 있습니다. Windows 응용 프로그램, 웹 응용 프로그램 또는 웹 서비스 일 수 있습니다. 그래서 어떤 효율적인 오류 처리 패턴을 결정할 수 없습니다.

여러분, 저를 도와주세요. 현재 내가 무엇을하고 있는가하는 것은, 내가 더 또한 같은 catch 블록이 다른 모든 기능/서브 루틴에서 사용이

Catch(ex as Exception) 
    If LogError then 
      MessageBox.Show("My_Module_Name :" & ex.Message) 
    EndIf 
    ErrorMessage = ex.Message 
End Try 

같은 것을 확인할 것, 부울 및 문자열 매개 변수로 ErrorMessage가 같은 두 바르의 LogError을 전달하고 그 부모 함수는 . 그래서 내가 필요로하는 것은 우아한 응용 프로그램 플랫폼 (win/web/service)에서 효율적으로 작동하는 우아한 처리 방법입니다.

+0

아래의 설명보다 더 두드러 지도록 여기에 덧글을 추가하겠습니다. 'throw ex'는'throw'와는 다르다는 것을 알아 두십시오. 일반적으로 당신은 느슨한 정보를 제외하고는 그 자체로 단지'throw '를 사용하기를 원합니다. 여기에 더 자세한 정보가있는 링크가 있습니다 : http://www.tkachenko.com/blog/archives/000352.html –

답변

5

로그 파일이나 이벤트 로그에 메시지를 기록하는 것이 좋지만 왜 고객이 어떤 방법을 추가하여 클라이언트가 어디에 기록해야 할지를 결정할 수 있도록 클라이언트를 선택하게하지 마십시오. 예외 처리기가 메시지를 처리하고 errormessage 변수에 넣는 대신에 로깅을 따라 throw을 따르므로 Exception이 처리 체인을 처리하는 방법을 알고있을 때까지 호출 체인에서 계속 처리하도록했습니다.

일반적으로 Exception을 잡는 것은 좋지 않지만 처리 할 수있는 예외 만 잡아야합니다. 하지만 로그에 기록한 다음 다시 던져 버리면 좋다고 생각합니다.

+0

파일이나 오류 로그에 예외 클래스가 직렬화 가능하고 직렬화되어 데이터베이스에 저장 될 수 있다는 점도 유의해야합니다. – zeocrash

+1

호, 맞다면 말하고 싶습니다. ABC는 내 응용 프로그램의 핵심 클래스이며 다양한 여러 클라이언트. 공공 클래스 ABC 공공 하위 XYZ() .statements ..... 캐치를 시도 (예외로 예) 던지기 전 끝 시도 종료 기능 엔드 클래스 클라이언트 1 (의 WinForm) 보호 된 void btnSave_Click (개체 보낸 사람, EventArgs 전자) { ABC abc = new ABC(); 시도해보십시오. { abc.XYZ(); 당신은 그냥 이후 단지를 제거 XYZ 예외 처리기에서 아무것도하지 않을 경우 } 캐치 (예외 예) { // 로깅 또는 표시 } } 내가 희망 , 내가 –

+0

까지 명확입니다 공간 낭비, 실제로 거기에 로그인 할 예정이라면 그대로 두었습니다. btnSave에서 catch (Exception)를 피하고 대신 처리 할 수있는 예외를 처리해야합니다 (예를 들어 액세스 권한이 없어서 실패한 경우, 사용자에게 저장 또는 다른 디렉토리를 선택하도록 알릴 수 있음).). –