2010-07-12 2 views
3

이 질문은 아마도 이전에 물어 본 질문 인 것처럼 느껴질 수 있지만 찾을 수는 없습니다 (다시 묻기도합니다).Windows .NET 서비스에서 오류 처리하는 방법

저는 파일 모니터링과 처리를 위해 Windows 서비스를 만들고 있습니다. 그 모든 일을 내가 원하는대로하고 있지만 파일 시스템이나 이벤트 로그에 읽기/쓰기를 할 때 코드가 오류를 던질 수있는 몇 가지 위치가 있음을 알고 있습니다. 나는 에러가 있기를 기대하지만 에러 메시지를 처리하기 위해 글로벌 에러 핸들링을하고 싶었다. 나는 이것을 어떻게하는지 잘 모르겠다.

내 첫 번째 생각은 ASP.NET 프로젝트에서 찾은 것과 유사한 일종의 전역 오류 처리기를 찾는 것이지만이 줄을 따라 아무것도 볼 수 없습니다.

다른 생각으로는 최상위 레벨 함수 호출을 모두 가져 와서 try/catch를 넣을 수 있다고 생각했습니다. 내가보기에는 모든 이벤트 처리기 코드와 서비스 시작 및 중지 메서드를 try/catch하는 것이 좋습니다. 이것은 좋은 방법으로 생각하지 않습니다. 그래서 나는 아마도 이것을 잘못된 방향으로 접근 할 것이라고 생각하고 있습니다. 아무도 내가 오류 처리 측면에서해야 할 일을 제안 할 수 있습니까?

나는 서비스에서 잠재적으로 서비스를 중지시킬 것이기 때문에 오류를 던지기를 원하지 않는다. 그렇지 않으면 나는 서비스 붕괴를 허용하고 자동으로 복구 메커니즘을 통해 다시 시작해야한다. ?

나는 서비스의 주요 방법으로 시도/캐치 퍼팅에 문제가 없습니다

답변

6

... :) 그래서 나와 함께 당신의 지혜를 공유하시기 바랍니다 여기에 매우 불확실 해요 당신이 할 수 있도록 오류를 기록 그들을 고쳐라. 잡힌 오류가 예상치 못한 경우 서비스를 완전히 닫을 수 있습니다.

또한 기본 try/catch 외에도 발생할 수있는 모든 잠재적 예외 (예 : 네트워크 문제)에 대해 try/catch를 추가해야하므로 올바른 동작을 복원 할 수 있습니다. 응용 프로그램이 충돌하여 서비스가 중단되는 것을 방지합니다.

마지막으로, 예외가 스레드 범위 외부로 전파되지 않기 때문에 모든 고유 스레드의 모든 최상위 메소드에 대해이 작업을 수행해야합니다.

0

우리는 수년 동안 작성한 많은 Windows 서비스에서이 기능을 성공적으로 사용했습니다.

우리는 항상 dll에 기능을 가지고 있습니다. 우리가 dll에서 함수를 인스턴스화하고 실행할 때 우리는 try/catch에서 호출을 래핑합니다. 그런 다음 서비스는 발생하는 예기치 않은 예외를 기록하거나 이에 응답 할 수 있습니다.

물론 try/catch 블록의 dll에서 의심스러운 코드를 감싸고 해당 코드도 적절하게 수행하십시오.

0

서비스가 절대로 실패하지 않아야합니다. 일반적으로 서비스의 일은 이벤트 (네트워크 호출 또는 타이머)에 의해 트리거됩니다 ... 각 이벤트에 대해 실행되는 코드는 서비스가 중단되지 않도록 try catch에 있어야합니다.

오류 및 기타 중요한 정보를 EventLog에 기록하는 것이 좋습니다. 이 작업을 수행하려면 log4net + EventLogAppender을 사용할 수 있습니다.

전체 디스크 또는 메모리 문제와 같은 하드웨어 문제로 인해 서비스가 중단 될 수 있습니다. 자동으로 다시 시작하려면 NT 서비스 옵션 대화 상자 또는 설치 프로그램에서 복구를 설정할 수 있습니다.

관련 문제