문제

Microsoft가 응용 프로그램 블록을 소개 한 이래로 나는 예외 처리 애플리케이션 블록. 나는 최근에 자세히 살펴 보았고 다음과 같이 기본 기능을 요약 할 것입니다 (이미 무엇을하는지 이미 알고 있다면 다음 블록을 건너 뛰십시오).

예외 처리 애플리케이션 블록은 구성 파일을 사용하여 중앙 집중화하고 완전 구성 가능하게 만드는 것을 목표로합니다. 주요 예외 처리 작업:

  • 예외를 기록합니다
  • 예외를 대체합니다
  • 예외를 포장합니다
  • 예외를 전파합니다
  • 등.

라이브러리는 시도 캐치 블록을 다음과 같이 수정하여 다음과 같습니다.

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

정책 이름에 대해 app.config에 지정된 내용을 기준으로문서는 여기를 참조하십시오), handleException도 ...

  • 완전히 새로운 예외를 던지십시오 (원래 예외 교체)
  • 원래의 예외를 새 예외로 마무리하고 던져
  • 예외를 삼키십시오 (즉, 아무것도하지 않습니다)
  • 원래 예외를 다시 줄이 있습니까?

또한 미리 더 많은 작업을 수행하도록 구성 할 수도 있습니다 (예 : 예외를 기록).

이제 내 문제가 있습니다. 예외가 교체, 포장, 삼키기 또는 재건되는지 여부를 구성 할 수있게하는 것이 어떻게 유리할 수 있는지 완전히 알지 못합니다. 내 경험상,이 결정은 코드를 작성할 때 이루어져야합니다. 일반적으로 예외 처리 동작을 변경할 때 주변 또는 호출 코드를 변경해야하기 때문입니다.

예를 들어, 특정 지점에서 특정 예외가 재고 대신 삼키도록 재구성 할 때 코드가 잘못 행동하기 시작할 수 있습니다 (예외가 발생할 때 어획량을 실행해서는 안되는 캐치 블록 후에 코드가있을 수 있음). 예외 처리의 다른 모든 가능한 변경 사항도 마찬가지입니다 (예 : 교체 -> Rethrow, 삼키기 -> 랩).

따라서 결론은 예외 처리 블록이 실제로 존재하지 않는 문제를 해결한다는 것입니다. 예외 로깅 및 알림 비트는 괜찮지 만 다른 모든 것들이 과잉 가입을위한 완벽한 예일뿐입니다.

도움이 되었습니까?

해결책

제어 흐름에 예외를 사용하는 경우 정책 기반 예외 처리에서 멀리 떨어져 있어야합니다.

그러나 회복 불가능한 것으로 취급하려는 예외의 경우 (배경 작업이 실패하고 소켓이 연결이 끊어졌으며 파일이 삭제되었습니다) 구성 가능한 정책 기반 예외 처리를 원할 수 있습니다.

예를 들어, API를 개발하는 경우 API의 모든 기능이 표준 예외 만 던질 수 있습니다 (ArgumentException, 내부 비표준 예외의 경우 (예 : A MyLibraryException). 이러한 유형의 경우 중요한 것은 무언가가 올바르게 작동하지 않는다는 것입니다. 당신은 예외를 뽑아 내고 무엇이 잘못되었는지 알아 내지 않습니다. 당신은 단순히 그 사실을 인정하고 있습니다 약간문제가 잘못되었고 당신은해야합니다 약간지금.

저것 약간당신이하는 일이 중요하지 않기 때문에 물건은 구성 할 수 있어야합니다. 사용자에게 메시지 상자를 표시 하시겠습니까? 모달 또는 비 모달? 예외를 기록 하시겠습니까? 예외를 어떻게 기록 하시겠습니까? 로깅 웹 서비스를 호출 하시겠습니까? 로그 파일에 추가 하시겠습니까? Windows Event Log에 편지를 보내시겠습니까? 데이터베이스에 항목을 삽입 하시겠습니까? 두 개의 데이터베이스에 항목을 삽입 하시겠습니까? 나머지 응용 프로그램에는 중요하지 않습니다. 예외를 처리하는 방법의 선택은 나머지 응용 프로그램과 완전히 직교합니다.

(제쳐두고, 이것은 구성 가능한 정책 기반 예외 처리에 접근하는 방법이 아닙니다. 컨테이너에 예외 로거 인터셉터를 등록하는 등 AOP 스타일을 향한 경향이 있습니다.)

다른 팁

회복 가능 상태가없는 기능을 개발할 때이 문제가 발생합니다. 이 정책 중심 예외 처리가 실제로 유용하다고 생각 하며이 프로젝트의 일부인 다른 모든 개발자가 실제로 회복 불가능한 예외에 대한 표준을 준수하도록 보장합니다.

위의 포스터에 동의합니다. 제어 흐름에 사용하는 경우 정책 기반 예외를 피할 수 있습니다.

"예외 처리 블록은 실제로 존재하지 않는 문제를 해결합니다"라는 진술에 동의해야합니다. 나는 릴리스 이후 블록을 사용했으며 실제로 그것을 사용하여 실제로 많은 것을 얻는 것처럼 느끼지 않습니다. 글쎄, 아마도 약간의 두통 일 것입니다. :)

시작하기 전에 나는 내가 좋아한다는 것을 인정할 것이다. WCF 서비스 경계에서의 예외 차폐 기능. 그러나 최근에 상당히 추가되었으며 코딩이 포함되어 있지 않습니다. 속성과 구성 만 포함하며 블록이 일반적으로 판매되는 방식이 아닙니다. 이것이 Microsoft가 보여주는 방식입니다 http://msdn.microsoft.com/en-us/library/cc309250.aspx

alt text

내 눈에는 위의 흐름 제어가 있습니다.

try
{
  // Run code.
}
catch(DataAccessException ex)
{
    bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy");
    if (rethrow)
    {
        throw;
    }
}

흐름 제어 측면을 위의 코드와 결합하면 확실히 잘못된 코드를 잘못 보이게합니다. (IF (Rethrow) 구조는 많은 추상화를 제공하지 않는다는 점을 염두에 두지 마십시오.)이를 통해 개발자는 정책 정의에 익숙하지 않은 개발자에게는 유지 보수가 더 어려워 질 수 있습니다. 만약 postHandlingAction 구성 파일이 변경되었습니다 (아마도 어느 시점에서 발생할 수 있음) 테스트되지 않은 예기치 않은 방식으로 응용 프로그램이 작동하는 것을 알 수 있습니다.

아마도 블록이 흐름 제어를 처리하지 않았지만 단순히 핸들러를 함께 체인 할 수있게되면 불쾌한 것으로 찾지 못할 것입니다.

그러나 아마도 그렇지 않을 것입니다. 나는 실제로 다음과 같은 요청을받는 것을 기억하지 않습니다.

  • 예외를 처리 할 때 새 기능을 추가하십시오 (예 : 이벤트 로그에 로그를 표시하는 것 외에도 이메일도 보냅니다. 실제로 로깅 블록은 이미 예외를 직접 로그인하면 자체적으로이를 수행 할 수 있습니다. :)). :)).
  • 전체 "정책"에서 예외 처리 동작 (삼키기, 재검사 또는 새로 던지기)을 변경하십시오.

나는 그것이 일어나지 않는다고 말하는 것이 아닙니다 (누군가 이야기가 있다고 확신합니다!); 예외 처리 애플리케이션 블록이 프로그램을 이해하고 유지하기가 어렵다고 생각하며 일반적으로 블록에서 제공하는 기능보다 중요합니다.

나는 이것이 전혀 엔지니어링이라고 생각하지 않습니다. 사실은. 예외가 중앙 핸들러를 통과 할 수 있다는 사실은 내 작업 라인에서 좋은 일이었습니다. 나는 모든 예외를 먹을 수있는 개발자들을 가지고 있었는데, 처리 여부는 맨 위에 거품을 일으키지 않고 최종 사용자 앞에서 놀라운 것을 넣거나, 겪지 않았을 때 서비스/데몬을 심각하게 엉망으로 만들었습니다.

이제 정책을 사용하면 앱 전체에 다시 시작하거나 불필요하게 뿌릴 필요없이 언제든지 로깅을 시작할 수 있습니다. 이제 앱을 오프라인으로 취하지 않고 예외 등을 볼 수 있습니다.

나에게 물어 보면 스마트 프로그래밍 ...

아주 간단하게 : 디버그 코드와 릴리스 코드에서 다른 예외 처리를 원한다면 유용 할 것입니다.

제 생각에는 예외 처리 블록을 사용하는 실제 값 중 하나는 캐치 블록의 한 줄의 코드로 시작됩니다.

BOOL RETHROW = ExceptionPolicy.HandleException (예 : "데이터 액세스 정책");

한 줄의 코드 - 얼마나 간단하게 얻을 수 있습니까? 한 줄의 코드 뒤에, 정책이 구성된 것처럼 정책에 대한 할당/업데이트를 소스 코드를 다시 컴파일하지 않고도 쉽게 수행 할 수 있습니다.

언급 된 바와 같이, 예외 정책은 실제로 많은 조치를 수행 할 수 있습니다. 캐치 블록 내에 표시된 코드 라인 뒤에 복잡성을 숨기는 것은 실제 값을 보는 곳입니다.

나는 복잡하지만 과도하게 말하지는 않았다. 따라서 내 생각은 유지 보수 중에 큰 배당금이 보일 것이며, 구성을 쉽게 변경할 수있는 유연성을 갖추고 여전히 동일한 소스 코드 라인을 가지고 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top