일반적인 예외를 잡는 것이 실제로 나쁜 일입니까?


56

나는 일반적으로 대부분의 코드 분석 경고에 동의하며이를 준수하려고합니다. 그러나 나는 이것으로 어려움을 겪고있다.

CA1031 : 일반 예외 유형을 포착하지 마십시오

이 규칙의 근거를 이해합니다. 그러나 실제로 예외 발생에 관계없이 동일한 조치를 취하려면 왜 각각을 구체적으로 처리해야합니까? 또한 특정 예외를 처리하는 경우 나중에 호출하는 코드가 변경되어 새로운 예외가 발생하면 어떻게됩니까? 이제 새 예외를 처리하기 위해 코드를 변경해야합니다. 반면에 단순히 Exception코드 를 잡았다면 변경할 필요가 없습니다.

예를 들어, Foo가 Bar를 호출하고 Foo가 Bar에서 발생한 예외 유형에 관계없이 처리를 중지해야하는 경우, 내가 잡는 예외 유형에 대해 구체적으로 지정하면 어떤 이점이 있습니까?

아마도 더 좋은 예일 것입니다.

public void Foo()
{
    // Some logic here.
    LogUtility.Log("some message");
}

public static void Log()
{
    try
    {
        // Actual logging here.
    }
    catch (Exception ex)
    {
        // Eat it. Logging failures shouldn't stop us from processing.
    }
}

여기서 일반적인 예외를 잡지 않으면 가능한 모든 유형의 예외를 잡아야합니다. 패트릭은 OutOfMemoryException이런 식으로 다루어서는 안된다는 좋은 지적 이 있습니다. 모든 예외를 무시하고 싶다면 어떻게해야 OutOfMemoryException합니까?


12
무엇에 대해 OutOfMemoryException? 다른 모든 것과 같은 취급 코드?
Patrick

@ 패트릭 좋은 지적. 귀하의 질문을 다루기 위해 질문에 새로운 예를 추가했습니다.
밥 혼

1
일반적인 예외를 잡는 것은 모든 사람이해야 할 일에 대한 일반적인 진술을하는 것만 큼 나쁩니다. 일반적으로 모든 것에 대한 단일 크기 접근 방식은 없습니다.

4
@Patrick OutOfMemoryError, 그 Exception이유 는 상속 트리 와는 별개입니다
Darkhogg

Ctrl-Alt-Del과 같은 키보드 예외는 어떻습니까?
Mawg

답변:


33

이러한 규칙은 일반적 으로 좋은 아이디어이므로 따라야합니다.

그러나 이것이 일반적인 규칙임을 기억하십시오. 모든 상황을 다루지는 않습니다. 가장 일반적인 상황을 다룹니다. 특정 상황이 있고 기술이 더 낫다는 주장을 할 수 있다면 (그리고 코드에 주석을 작성하여 주장을 분명히 할 수 있어야합니다) 그렇게 한 다음 동료 검토를 받으십시오.

논쟁의 반대편.

위의 예가 그렇게하기에 좋은 상황이라고 생각하지 않습니다. 로깅 시스템이 실패하면 (아마도 다른 예외를 기록하고 있음) 응용 프로그램을 계속하고 싶지 않을 것입니다. 사용자가 무슨 일이 있었는지 볼 수 있도록 예외를 출력으로 출력하고 인쇄하십시오.


2
동의합니다. 아주에서 적어도 , 지금 일반 로깅은 오프라인주지 조항의 일종하게되는 몇 가지 다른 경우 아무것도 STDERR하지 않으려면, 디버깅 출력의 종류.
Shadur

6
나는 둘 다 공감했지만, 당신은 사용자가 아닌 개발자처럼 생각하고 있다고 생각합니다. 사용자는 일반적으로 응용 프로그램을 사용할 수있는 한 로깅 발생 여부를 신경 쓰지 않습니다.
Mawg

1
흥미롭게도 log4net은 로깅이 실패하기 때문에 앱을 명시 적으로 중지하고 싶지 않습니다. 그리고 나는 그것이 당신이 로깅하는 것에 달려 있다고 생각합니다. 보안 감사는 프로세스를 중단시킵니다. 그러나 디버그 로그? 그렇게 중요하지 않습니다.
Andy

1
@ 앤디 : 네, 당신이하는 일에 따라 모든 것이 다릅니다.
Martin York

2
왜 이해하지 못합니까? 그렇게하려고 애 쓰지 말아야합니까?
Mawg

31

예, 일반적인 예외를 잡는 것은 나쁜 일입니다. 일반적으로 예외는 프로그램이 요청한 작업을 수행 할 수 없음을 의미합니다.

처리 할 있는 몇 가지 유형의 예외 있습니다.

  • 치명적인 예외 : 메모리 부족, 스택 오버플로 등 일부 초자연적 힘이 당신의 우주를 망쳐 놓았으며 프로세스는 이미 죽어 가고 있습니다. 상황을 더 좋게 만들 수 없으므로 포기하십시오.
  • 사용중인 코드의 버그로 인해 예외가 발생 했습니다. 처리하려고하지 말고 문제의 원인을 수정하십시오. 흐름 제어에 예외를 사용하지 마십시오
  • 예외 상황 :이 경우에만 예외를 처리하십시오. 여기에는 네트워크 케이블 분리, 인터넷 연결 작동 중지, 권한 누락 등이 포함됩니다.

아, 그리고 일반적으로 : 예외를 잡으면 어떻게 해야할지 모른다면 빨리 실패하는 것이 좋습니다 (호출자에게 예외를 전달하고 처리하도록하십시오)


1
질문의 특정 사례는 어떻습니까? 로깅 코드에 버그가있는 경우 실제로 중요한 코드는 영향을받지 않아야하므로 예외를 무시해도됩니다.
svick

4
대신 로깅 코드에서 버그를 수정하지 않겠습니까?
Victor Hurdugaci

3
빅터, 아마 버그가 아닙니다. 로그가있는 디스크에 공간이 부족하면 로깅 코드의 버그입니까?
Carson63000

4
@ Carson63000-그렇습니다. 로그가 작성되지 않아서 버그입니다. 고정 크기 회전 로그를 구현하십시오.
detly

5
이것이 가장 좋은 답변이지만, 한 가지 중요한 측면이 빠졌습니다 : 보안 . 나쁜 녀석들이 당신의 프로그램을 정리하려고 한 결과로 발생하는 몇 가지 예외가 있습니다. 처리 할 수없는 예외가 발생하면 해당 코드를 더 이상 신뢰할 수 없습니다. 아무도 나쁜 사람들을
들여 보내는

15

맨 위 바깥 쪽 고리에는 가능한 한 모든 것을 인쇄하기 위해 이들 중 하나가 있어야하며, 끔찍하고 폭력적이며 시끄러운 죽음으로 사망해야합니다 (이러한 일이 발생하지 않아야하며 누군가가들을 필요가 있음).

그렇지 않으면 이 위치에서 발생할 수있는 모든 것을 예상 하지 못했을 때 일반적으로 매우주의해야 하므로 올바르게 처리하지 않을 것입니다. 가능한 한 구체적으로 말해서 당신 이 일어날 것으로 알고 있는 사람들 만 잡으십시오 .


1
나는 이론적으로 이것에 동의한다. 그러나 위의 로깅 예제는 어떻습니까? 로깅 예외를 무시하고 계속하려면 어떻게해야합니까? 더 심각한 예외를 발생시키면서 던질 수있는 모든 예외를 포착하고 각 예외를 처리해야합니까?
밥 혼

6
@ 밥 호른 : 그것을 보는 두 가지 방법. 예, 로깅이 특별히 중요하지 않다고 말할 수 있으며 실패하면 앱이 중단되지 않아야합니다. 그리고 그것은 충분히 공평합니다. 그러나 애플리케이션이 5 개월 동안 로그에 실패하고 전혀 모른다면 어떻게해야합니까? 나는 이것이 일어나는 것을 보았다. 그런 다음 로그가 필요했습니다. 재앙. 로깅 실패를 중지하기 위해 생각할 수있는 모든 작업을 수행하는 것이 좋습니다. (그러나 당신은 그것에 대해 많은 합의를 얻지 못할 것입니다.)
pdr

@pdr 필자의 로깅 예제에서는 일반적으로 이메일 알림을 보냅니다. 또는 로그를 모니터링 할 시스템이 있으며 로그가 활발하게 채워지지 않으면 지원팀에서 경고를받습니다. 그래서 우리는 다른 방법으로 로깅 문제를 알게되었습니다.
Bob Horn

오히려 부자연 로깅 예를 @BobHorn -하기 좋은 길이로 이동, 내가 아는 대부분의 로깅 프레임 워크를 하지 예외를 던질 하고 그것을 만들 것 같이 (그런 식으로 호출 할 수 없습니다만한 "로그 문은 파일 Y에 라인 X에서 일어난"쓸모 )

@ pdr 로깅 구성이 실패 할 경우 로깅 프레임 워크가 응용 프로그램을 중지시키는 방법에 대한 질문을 로그 백 목록 (Java)에서 제기했습니다. 단순히 로그가 있어야하므로 자동 실패는 허용되지 않습니다. 좋은 해결책은 아직 계류 중입니다.

9

나쁜 것이 아니라 특정 캐치가 더 나을뿐입니다. 구체적으로 말하자면, 실제로 애플리케이션이 수행하는 작업을보다 구체적으로 이해하고 더 잘 제어 할 수 있음을 의미합니다. 일반적으로 예외를 잡아서 기록하고 계속하는 상황이 발생하면 어쨌든 나쁜 일이 발생할 수 있습니다. 코드 블록이나 메서드에서 발생할 수있는 예외를 구체적으로 파악하는 경우 로깅과 최선을 기대하는 대신 실제로 복구 할 가능성이 더 높습니다 .


5

두 가지 가능성은 상호 배타적이지 않습니다.

이상적인 상황에서는 메소드가 생성 할 수있는 가능한 모든 유형의 예외를 포착하고 예외별로 처리하며 결국에는 catch미래의 미지의 예외를 포착하기 위한 일반 조항을 추가해야합니다 . 이렇게하면 두 세계를 모두 활용할 수 있습니다.

try
{
    this.Foo();
}
catch (BarException ex)
{
    Console.WriteLine("Foo has barred!");
}
catch (BazException ex)
{
    Console.WriteLine("Foo has bazzed!");
}
catch (Exception ex)
{
    Console.WriteLine("Unknown exception on Foo!");
    throw;
}

보다 구체적인 예외를 잡으려면 먼저 예외를 두어야합니다.

편집 : 의견에 언급 된 이유로 마지막 캐치에 다시 던졌습니다.


2
기다림. 왜 콘솔에 알려지지 않은 예외를 기록하고 계속하고 싶습니까? 코드에서 알 수없는 예외 인 경우 시스템 오류에 대해 이야기하고있을 수 있습니다. 이 시나리오에서 수행하는 것은 아마도 나쁜 생각입니다.
pdr

1
@pdr 확실히 당신은 그것이 좋은 예라고 생각합니다. 요점은 특정 예외를 처리하는 방법이 아니라 특정 예외와 일반 예외를 모두 포착하는 것입니다.
Rotem

@Rotem 여기에 좋은 대답이 있다고 생각합니다. 그러나 pdr에는 요점이 있습니다. 코드는 그대로 잡아서 계속하는 것처럼 보입니다. 이 예를보고있는 일부 초보자는 이것이 좋은 방법이라고 생각할 수 있습니다.
밥 혼

결정된 것이 든 그렇지 않든 그것은 당신의 대답을 틀리게 만듭니다. 메모리 부족 및 디스크 용량 부족과 같은 예외를 포착하고이를 삼키는 즉시 일반적인 예외를 포착하는 것이 실제로 나쁜 이유를 입증하고 있습니다.
pdr

1
일반 예외를 포착하여 기록 만하는 경우, 로깅 후에 다시 던져야합니다.
Victor Hurdugaci

5

나는 최근에 똑같이 숙고 해 왔으며 잠정적 인 결론은 .NET 예외 계층 구조 가 심각하게 엉망 이기 때문에 단순한 질문이 발생한다는 것입니다.

예를 들어, 낮은 가지고 있습니다 당신은 예외에 대한 합리적인 후보가 될 하지 않는 것이 있기 때문에, 할려구을 경향 코드가 아닌 합법적 인 런타임 오류 버그를 나타냅니다. 아. 넵. 그렇게 그 제외하고, 에서 파생 않습니다 직접, 그래서 당신은 잡기 (또는 잡을되지 않음)에 모든 "논리적 오류"를 배치 할 수없는 버킷가 없습니다.ArgumentNullExceptionNullReferenceExceptionNullReferenceExceptionSystemException

그런 다음 IMNSHO가 중요한 데 서투른 SEHException(를 통해 파생 ExternalException) SystemException따라서이 "정상적인"만들SystemException 당신이 얻을 때SEHException, 당신은 덤프를 작성하고 당신이 할 수있는 한 빨리 종료 할 - .NET 4에서 시작하여 적어도 일부 SEH 예외는발견되지 않은 손상된 상태 예외 로 간주됩니다. 좋은 점과CA1031규칙을 더욱 쓸모 없게만드는 사실은이제 게으른 사람들catch (Exception)이 어쨌든 이러한 최악의 유형을 잡을수 없기 때문입니다.

그런 다음 다른 Framework 항목이 Exception직접 또는 via를 일관성없이 파생하여 SystemExceptioncatch-clauses를 심각도 무트와 같은 그룹으로 그룹화하려고 시도합니다.

Vexing ExceptionC# 이라는 명성의 Lippert 씨의 작품이 있는데 , 그는 예외를 유용하게 분류 할 수 있습니다 C#. .NET의 언어와 디자인을 제외하고는 "외인성"인 것만 잡기를 원할 수 있습니다. 프레임 워크 예외는 간결한 방식으로 "외인적인 것만 잡을"수 없다. (그리고, 예를 들면,는 OutOfMemoryException아주 잘 든 큰 버퍼를 할당 할 수있는 API에 대한 완전히 정상 복구 가능한 오류 수)

나를 위해 결론은,이다 방법 C#catch 블록이 작동하고 프레임 워크 예외 계층 구조를 설계하는 방법, 규칙이 CA1031완전히 쓸모 이상입니다 . 그것은 "예외를 삼키지 않는다"하지만 예외를 삼켜야하지만 당신은 무엇에, 당신이 잡을 것을 함께 할 수있는 제로가의 근본 문제를 돕기 위해 다음 을 수행하십시오

있다 적어도 4 가지 방법으로 합법적으로 잡은 처리하기는 Exception, 그리고 CA1031표면적으로 그들 중 하나 (즉 다시 던져 경우)를 처리 할 것으로 보인다.


사이드 참고로,라고하는 C # 6 기능 거기에 예외 필터 할 것입니다 CA1031제대로, 제대로, 제대로 캐치 예외를 필터링 할 수있을 것입니다 그 이후 다시 약간 더 유효하고, 필터링되지 않은 쓰기 적은 이유가이 catch (Exception).


1
가장 큰 문제 OutOfMemoryException는 코드가 좋은 방법이 없다는 것인데, 코드가 특정 할당의 실패가 실패 할 준비가되었음을 "만"확신 할 수 있다는 것입니다. 다른 심각한 예외가 발생 OutOfMemoryException했을 수 있으며 다른 예외에서 스택이 해제되는 동안 발생했을 수 있습니다. Java는 "자원을 사용하여 시도"하여 파티에 늦었을 수도 있지만 스택 해제 중에 .NET보다 약간 더 나은 예외를 처리합니다.
supercat

1
@supercat-충분히 사실이지만 finally 블록에서 문제가 발생하면 다른 일반적인 시스템 예외와 거의 같습니다.
Martin Ba

1
사실이지만 finally, 원래 예외와 새로운 예외가 모두 기록되는 방식으로 현실적으로 발생할 것으로 예상되는 예외로부터 블록을 보호 할 수 있으며 일반적으로 차단 해야합니다 . 불행히도, 그렇게하려면 종종 메모리 할당이 필요하며, 이로 인해 자체 장애가 발생할 수 있습니다.
supercat

4

포켓몬 예외 처리 (모두 잡아야합니다!)가 항상 나쁜 것은 아닙니다. 메서드를 클라이언트, 특히 최종 사용자에게 노출시킬 때 응용 프로그램이 중단되거나 타는 것보다 무엇이든 모든 것을 잡는 것이 좋습니다.

일반적으로 가능한 한 피해야합니다. 예외 유형에 따라 특정 조치를 취할 수 없다면 예외를 처리하지 않는 것이 좋으며 예외를 버블 링하는 대신 예외를 삼키거나 잘못 처리 할 수 ​​있습니다.

더 많은 독서 를 위해이 SO 답변을 살펴보십시오 .


1
이 상황 (개발자가 포켓몬 트레이너 여야하는 경우)은 전체 소프트웨어를 직접 만들 때 나타납니다. 계층, 데이터베이스 연결 및 사용자 GUI를 만들었습니다. 연결 상실, 사용자 폴더 삭제, 데이터 손상 등의 상황에서 앱을 복구해야합니다. 최종 사용자는 다운 및 충돌하는 앱을 좋아하지 않습니다. 그들은 폭발적인 폭발하는 컴퓨터에서 작동 할 수있는 앱을 좋아합니다!
Broken_Window

나는 지금까지 이것을 생각하지 못했지만 포켓몬에서는 일반적으로 '모두 잡기'로 각각 하나를 원하고 구체적으로 잡는 것을 처리해야한다고 가정합니다.이 문구의 일반적인 사용과는 반대입니다 프로그래머들 사이에서.
Magus

2
@Magus :와 같은 방법을 사용하면 LoadDocument()잘못 될 수있는 모든 것을 식별하는 것은 본질적으로 불가능하지만, 발생할 수있는 예외의 99 %는 단순히 "이름이 다음과 같은 파일 이름을 해석 할 수 없습니다. 문서를 처리해야합니다. " 누군가가 유효한 문서 파일이 아닌 것을 열려고 시도하면 응용 프로그램이 중단되어 열려있는 다른 문서가 모두 종료되지 않아야합니다. 이러한 경우 포켓몬 오류 처리는 추악하지만 좋은 대안은 없습니다.
supercat

@ supercat : 나는 언어 적 요점을 만들고 있었다. 그러나 잘못된 파일 내용은 여러 종류의 예외를 발생시키는 것으로 생각하지 않습니다.
Magus

1
@ 마구스 : 모든 종류의 예외를 던질 수 있습니다. 그것이 문제입니다. 파일에서 유효하지 않은 데이터로 인해 발생할 수있는 모든 종류의 예외를 예상하는 것은 종종 어려운 일입니다. PokeMon 처리를 사용하지 않으면 응용 프로그램이 죽을 위험이 있습니다. 예를 들어 파일 1 이로 드하는 데 10 진수 형식의 32 비트 정수가 필요한 곳에 매우 긴 자릿수의 문자열이 포함되어 있고 숫자 오버플로가 발생했기 때문에 파싱 ​​로직.
supercat

1

프로그램을 정의되지 않은 상태로두기 때문에 일반적인 예외를 잡는 것은 좋지 않습니다. 문제가 발생한 곳을 모르므로 프로그램이 실제로 수행 한 작업이나 수행하지 않은 작업을 알 수 없습니다.

모든 것을 잡을 수있는 곳은 프로그램을 닫을 때입니다. 당신이 그것을 깨끗하게 정리할 수있는 한. 닫는 프로그램만큼 성가신 것은 없습니다. 오류 대화 상자 만 있으면 아무 것도 할 수없는 오류 대화 상자가 나타나고 컴퓨터가 종료되지 않습니다.

분산 환경에서 로그 방법은 역효과를 일으킬 수 있습니다. 일반적인 예외를 발견하면 다른 사용자가 로그를 작성하지 못하도록 프로그램이 여전히 로그 파일에 대한 잠금을 보유하고 있음을 의미 할 수 있습니다.


0

이 규칙의 근거를 이해합니다. 그러나 실제로 예외 발생에 관계없이 동일한 조치를 취하려면 왜 각각을 구체적으로 처리해야합니까?

다른 사람들이 말했듯이, 예외가 발생했는지에 관계없이 취해야 할 행동을 상상하는 것은 정말 어렵습니다 (불가능하지는 않지만). 그냥 하나의 예는 프로그램의 상태가 손상된 상황이다 어떤 추가 처리가 문제가 발생할 수 있습니다 (이 뒤에 이론적 근거이다 Environment.FailFast).

또한 특정 예외를 처리하는 경우 나중에 호출하는 코드가 변경되어 새로운 예외가 발생하면 어떻게됩니까? 이제 새 예외를 처리하기 위해 코드를 변경해야합니다. 반면 단순히 예외를 잡으면 내 코드를 변경할 필요가 없습니다.

취미 코드의 경우 포착하는 Exception것이 좋지만 전문가 급 코드의 경우 새로운 예외 유형을 도입하는 경우 메소드 서명의 변경과 동일한 방식으로 처리해야합니다. 즉, 주요 변경으로 간주됩니다. 이 관점에 가입하면 클라이언트 코드를 변경 (또는 검증)하는 것이 유일한 올바른 행동 과정이라는 것을 즉시 알 수 있습니다.

예를 들어, Foo가 Bar를 호출하고 Foo가 Bar에서 발생한 예외 유형에 관계없이 처리를 중지해야하는 경우, 내가 잡는 예외 유형에 대해 구체적으로 지정하면 어떤 이점이 있습니까?

물론, 예외가 발생하지 않기 때문 Bar입니다. Bar호출 스택에있는 시간 동안 Bar의 클라이언트 또는 런타임이 발생할 수있는 예외도 있습니다 . 잘 작성된 사람 Bar은 필요한 경우 호출자가 자체적으로 생성 한 예외를 구체적으로 잡을 수 있도록 필요한 경우 자체 예외 유형을 정의해야합니다.

OutOfMemoryException을 제외한 모든 예외를 무시하려면 어떻게해야합니까?

IMHO 이것은 예외 처리에 대해 잘못 생각하는 방법입니다. 블랙리스트가 아닌 화이트리스트 (캐치 예외 유형 A 및 B)에서 작동해야합니다 (X를 제외한 모든 예외를 캐치).


시도 된 작업이 부작용없이 실패했음을 나타내거나 시스템 상태에 대한 부정적인 영향을 나타내는 모든 예외에 대해 수행해야하는 작업을 지정하는 것이 종종 가능합니다. 예를 들어, 사용자가로드 할 문서 파일을 선택하면 프로그램은 해당 이름을 "디스크 파일의 데이터를 사용하여 문서 개체 만들기"메서드에 전달하고 해당 메서드는 응용 프로그램이 예상하지 못한 특정 이유로 실패합니다. 위의 기준을 충족하는 경우) 올바른 동작은 응용 프로그램을 중단시키는 대신 "문서를로드 할 수 없습니다"메시지를 표시하는 것입니다.
supercat

불행히도, 예외가 클라이언트 코드가 알고 싶어하는 가장 중요한 것을 나타낼 수있는 표준 수단은 없습니다. 요청 된 작업을 수행 할 수 없다는 것이 암시하는 것 이상의 시스템 상태에 문제가 있는지 여부입니다. 따라서 모든 예외를 처리해야하는 상황 은 드물지만 많은 예외를 동일한 방식으로 처리해야하는 상황이 많으며 모든 예외가 만족하는 기준이없는 경우도 있습니다. 다르게 취급해야합니다.
supercat

0

아마 . 모든 규칙에는 예외가 있으며 규칙을 엄격하게 준수해서는 안됩니다. 예를 들어 모든 예외를 삼키는 것이 합당한 사례 중 하나 수 있습니다. 예를 들어 중요한 프로덕션 시스템에 추적을 추가하려는 경우 변경 사항이 앱의 주요 작업을 방해하지 않는지 확인하려는 경우.

그러나 모든 실패를 자동으로 무시하기로 결정하기 전에 가능한 실패 원인에 대해 신중하게 고려해야합니다. 예를 들어, 예외의 이유가 다음과 같은 경우 :

  • 로깅 메소드의 프로그래밍 오류로 인해 항상 특정 예외가 발생 함
  • 구성에서 로깅 파일의 유효하지 않은 경로
  • 디스크가 꽉 찼습니다

이 문제가 있음을 즉시 알리고 싶지 않아서 고칠 수 있습니까? 예외를 삼키는 것은 무언가 잘못되었다는 것을 결코 알지 못한다는 것을 의미합니다.

디스크가 가득 찬 것과 같은 일부 문제로 인해 응용 프로그램의 다른 부분도 실패 할 수 있습니다. 그러나이 실패는 지금 기록되지 않으므로 알 수 없습니다!


0

기술적 관점이 아닌 논리적 관점에서이 문제를 해결하고 싶습니다.

이제 새 예외를 처리하기 위해 코드를 변경해야합니다.

글쎄, 누군가가 그것을 처리해야 할 것입니다. 그것이 아이디어입니다. 라이브러리 코드 작성자는 새 예외 유형을 추가하는 데 신중해야하지만 클라이언트를 중단시킬 가능성이 높기 때문에이 문제가 자주 발생해서는 안됩니다.

귀하의 질문은 기본적으로 "무엇이 잘못되었는지 신경 쓰지 않는다면 어떻게됩니까? 나는 그것이 무엇인지 알아내는 번거 로움을 거쳐야합니까?"

여기에 아름다움 부분이 있습니다 : 아닙니다.

"따라서 다른 방법으로 볼 때 카펫 아래에 불쾌한 일이 자동으로 튀어 나와서 처리 될 수 있습니까?"

아니요, 그것이 작동하는 방식이 아닙니다.

요점은 가능한 예외 모음이 항상 예상 한 모음보다 크며 지역의 작은 문제와 관련하여 관심이 있다는 것입니다. 예상 한 것을 처리하고 예상치 못한 일이 발생하면이를 삼키기보다는 상위 레벨 처리기에 맡기십시오. 예상치 못한 예외에 신경 쓰지 않으면 호출 스택에 누군가가 내기를 걸고 예외가 처리기에 도달하기 전에 종료하는 것은 방해가 될 것입니다.

"하지만 ...하지만 ... 내가 신경 쓰지 않는 다른 예외 중 하나가 내 작업을 실패로 만들 수 있습니다!"

예. 그러나 현지에서 처리하는 것보다 항상 더 중요합니다. 화재 경보 나 상사처럼 당신이하고있는 일을 멈추고 더 시급한 일을하도록 지시합니다.


-3

모든 프로세스의 최상위 수준에서 일반적인 예외를 파악하고 가능한 한 버그를보고 한 다음 프로세스를 종료하여 처리해야합니다.

일반적인 예외를 포착하지 말고 계속 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.