포괄 또는 기본 예외 클래스에 예외를 기록하는 것이 더 합리적입니까?


15

상당히 큰 웹 앱을 리팩토링하는 중입니다. 주요 문제 중 하나는 일관성없는 오류 처리이며 합리적인 전략을 세우려고합니다. 본질적으로 ErrorExceptions의 PHP 오류 와 Exception 에서 직접 상속되는 사용자 정의 기본 예외 클래스 를 설정 하는 set_error_handler 를 통해 사용자 정의 오류 처리기를 만들었습니다 .

프로덕션에서는 set_exception_handler 를 통해 일반 예외 catch-all을 사용하고 있으며 예외 로깅 * 을 믹스 에 추가 하려고합니다. 내 딜레마는 기본 예외 클래스 또는 포괄 전체에서 실제 로깅을 수행 할 위치입니다.

나는 그것을 모두에 기록 해야하는 두 가지 이유를 생각했습니다.

  • 코드에는 기본 예외 클래스의 적절한 하위로 변환해야하는 예외가 많이 있습니다. 그 때까지 모든 예외가 기록되는 것은 아닙니다.
  • 어쨌든 포괄에서 그것을하는 것이 더 자연 스럽습니다. 기본 예외 클래스는 그 이상을해서는 안됩니다. (단 하나의 책임 원칙 일 수도 있지만 오해의 소지가있을 수 있습니다)

기본 예외 클래스에 로그인해야하는 한 가지 이유는 다음과 같습니다.

  • 현재 포괄은 생산에만 사용됩니다. 다른 환경 (개발, 테스트)에서는 쉽게 도입 할 수 있지만 프로덕션 환경에서는 오류가 404/503 오류 페이지로 변환되므로 환경에 따라 오류가 다르게 처리되므로 약간의 조정이 필요합니다.

예외를 기록 할 위치에 대한 적절한 관행이 있습니까?

* 로깅에는 처음에 텍스트 파일에 쓰는 것이 포함되며 특정 유형의 예외에 대한 메일 전송으로 발전 할 수 있습니다.


@unholysampler의 답변에 의해 프롬프트되는 몇 가지 설명 :

나는 통제 할 수없는 많은 타사 물건과 함께 2 * 10 ^ 6 슬로 코드베이스에 직면하고 있으며, 일부 코드는 PHP의 이전 예외를 제어합니다. 그리고 최근에는 엉뚱한 최근 코드가 있습니다. 우리는 생각을 멈추고 해킹 당했을 때의 오랜 압박으로부터 회복하고 있습니다.

모든 불일치를 해결하고 합리적인 오류 처리 방식을 도입하기 위해 적극적으로 리팩토링하고 있지만 시간이 좀 걸릴 것입니다. 오류가 적절하게 처리되는 시점에 도달 할 때까지 수행 할 작업에 더 관심이 있습니다. 나는 아마도 어느 시점에서 현명한 예외 전략에 대해 다른 질문을 할 것이다.

로깅의 주된 동기는 생산에 문제가 생길 때마다 휴대폰으로 이메일을받는 것입니다. 나는 데이터 덤프가 커지면 신경 쓰지 않습니다. 그렇다면 매번 오래된 덤프를 삭제하는 cron 작업을해야합니다.

답변:


11

간단히 말해서 예외의 존재를 기록해야하는 유일한 경우는 예외를 처리 할 때입니다.

예외가 발생하면 코드가 올바르게 진행될 수없는 상태에 도달했기 때문입니다. 예외를 발생 시키면 발생한 오류에 대한 특정 메시지를 프로그램에 나타냅니다. 제대로 처리 할 수있을 때까지 예외를 포착해서는 안됩니다.

기본 응용 프로그램의 일부로 작성하는 코드는 throw 될 수있는 예외 유형과 발생시기를 알고 있어야합니다. 예외없이 생산적인 것을 할 수 없다면 잡아서는 안됩니다. 처리 될 때까지 예외를 기록하지 마십시오. 핸들링 코드 만이 프로그램 흐름과 관련하여 예외의 의미와 응답 방법을 알고 있습니다. 여기에 로그 메시지를 작성하는 것이 이치에 맞습니다. 로깅 프레임 워크를 사용하는 경우 메시지의 로그 레벨을 설정하고 잠재적으로 필터링 할 수 있습니다. 이는 발생할 수 있지만 예외는 아니며 예외적으로 깨끗하게 복구 할 수있는 예외에 효과적입니다.

예외는 당신의 코드가 추악한 죽음에 부딪치지 않도록하는 마지막 도랑 노력입니다. 지금까지 얻은 경우 가능한 모든 상태 및 오류 정보를 기록합니다. 그런 다음 모든 것이 멈추기 전에 프로그램이 충돌하고 있음을 사용자에게 알릴 수 있도록 최선을 다하십시오. 이 코드를 절대로 실행하지 않는 것이 목표입니다.

기본 클래스에 로깅을 임베드하는 경우 위 지침을 따르지 않습니다. 기본 클래스는 코드 상태에 대해 아무것도 모릅니다. 스택 추적을 갖는 것은 구문 분석을 기반으로 결정하는 코드를 작성하지 않기 때문에 계산되지 않습니다. 기본 클래스는 심각도 또는 예외 처리 방법을 나타내는 작업을 수행 할 수 없습니다. 깔끔하게 처리하고 복구 할 수있는 간단한 예외가있을 때마다 거대한 데이터 덤프와 스택 추적을 원하지 않습니다.


귀하의 답변에 의해 제기 된 질문에 대한 설명을 추가했습니다. 내가 수집 한 것으로부터, 질문의 실질적인 측면에서 당신은 포괄 로그인을 제안합니까?
yannis

1
@YannisRizos : 그렇습니다. 포괄을 첫 번째 단계로 구현해야합니다. 포괄에 대해 내가 말한 것은 코드 흐름의 정상적인 부분으로 사용하지 않도록하는 것입니다. 처리되지 않은 예외 처리기를 구현하는 것은 코드가 나쁜 일을 할 때마다 많은 정보를 얻을 수 있기 때문에 중요합니다.
unholysampler

"대체되지 않는 한 로그해야 할 것들이 있습니다"라는 개념을 편리하게 처리 할 수있는 로깅 프레임 워크가 없습니까? 스택을 해제하는 과정에서 새 예외가 발생하면 마지막 로그 보고서가 대체되지 않아 기록되는 경우를 제외하고 예외를 확인한 각 계층은 이전의 데이터를 대체 할 수 있습니다. 이러한 패턴을 지원하는 프레임 워크가 없습니까?
supercat

3

언어 / 런타임으로 예외의 원인을 쉽게 결정할 수없는 경우 예외 발생시이를 기록하는 경우가 있습니다. C ++ 및 일부 JS 엔진은 예외를 포착 할 때까지 예외의 파일 + 라인 또는 호출 스택을 노출시키지 않습니다 / 그러나이 정보는 예외를 구성 할 때 사용할 수 있습니다.

우리 솔루션은 런타임 구성을 사용하여 이러한 문제를 진단 할 때 저렴한 스택과 함께 예외 유형을 로깅 할 수있는 메커니즘을 제공하는 것이 었습니다.


+1 그것은 확실히 던져 질 때 기록하는 좋은 사례입니다 ... PHP는 잡을 때 전체 스택 추적을 제공하므로 아마도 다른 방향으로 갈 것입니다.
yannis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.