[exception-handling] 빈 캐치 블록이 왜 나쁜 생각입니까? [닫은]

try-catch에 대한 질문을 보았습니다 .Jon Skeet을 포함한 어떤 사람들은 빈 캐치 블록이 정말 나쁜 생각이라고 말합니까? 왜 이런가요? 빈 캐치가 잘못된 설계 결정이 아닌 상황이 없습니까?

예를 들어, 때때로 당신은 어딘가에서 추가 정보를 원하고 (웹 서비스, 데이터베이스)이 정보를 얻을지 여부는 실제로 신경 쓰지 않습니다. 그래서 당신은 그것을 얻으려고 노력하고, 어떤 일이 발생해도 괜찮습니다. “catch (Exception ignore) {}”를 추가하면됩니다.



답변

일반적으로 빈 try-catch는 오류 조건을 자동으로 삼킨 후 실행을 계속하기 때문에 나쁜 생각입니다. 때때로 이것은 옳은 일일 수 있지만, 종종 개발자가 예외를 보았고 이에 대해 무엇을해야하는지 알지 못했기 때문에 빈 캐치를 사용하여 문제를 침묵시킵니다.

엔진 경고등에 검은 테이프를 붙이는 것과 동등한 프로그래밍입니다.

예외를 처리하는 방법은 사용중인 소프트웨어의 계층에 따라 다릅니다 . Rainforest의 예외 .


답변

일반적으로 나쁜 생각 입니다 . 실패 (예외 조건,보다 일반적으로)가 아무런 반응없이 적절하게 충족되는 진정한 희귀 조건이기 때문입니다. 또한 빈 catch블록은 예외 엔진을 사용하여 선점 적으로 수행해야하는 오류를 확인하는 사람들이 사용하는 일반적인 도구입니다.

항상 나쁘다는 말 은 사실이 아닙니다. 오류가있는 것을 신경 쓰지 않거나 오류의 존재로 인해 어쨌든 아무것도 할 수 없음을 나타내는 상황이있을 수 있습니다 (예 : 텍스트 로그 파일에 이전 오류를 기록 할 때 당신은 IOException어쨌든 새로운 오류를 쓸 수 없다는 것을 의미합니다).


답변

빈 캐치 블록을 사용하는 사람이 나쁜 프로그래머이며 자신이 무엇을하는지 모른다고 말하는 것까지는 말하지 않습니다.

필요한 경우 빈 캐치 블록을 사용합니다. 때로는 내가 사용하는 라이브러리의 프로그래머가 자신이 무엇을하는지 알지 못하고 아무도 필요없는 상황에서도 예외가 발생합니다.

예를 들어, 일부 http 서버 라이브러리를 고려하십시오. 클라이언트의 연결이 끊어져서 index.html보낼 수 없기 때문에 서버에서 예외가 발생하면 신경 쓰지 않아도됩니다.


답변

정당화 될 수있는 경우는 드물다. 파이썬에서는 종종 이런 종류의 구성을 볼 수 있습니다.

try:
    result = foo()
except ValueError:
    result = None

따라서 (응용 프로그램에 따라) 다음을 수행해도됩니다.

result = bar()
if result == None:
    try:
        result = foo()
    except ValueError:
        pass # Python pass is equivalent to { } in curly-brace languages
 # Now result == None if bar() returned None *and* foo() failed

최근 .NET 프로젝트에서 특정 인터페이스를 구현하는 클래스를 찾기 위해 플러그인 DLL을 열거하는 코드를 작성해야했습니다. VB.NET의 관련 코드 비트는 다음과 같습니다.

    For Each dllFile As String In dllFiles
        Try
            ' Try to load the DLL as a .NET Assembly
            Dim dll As Assembly = Assembly.LoadFile(dllFile)
            ' Loop through the classes in the DLL
            For Each cls As Type In dll.GetExportedTypes()
                ' Does this class implement the interface?
                If interfaceType.IsAssignableFrom(cls) Then

                    ' ... more code here ...

                End If
            Next
        Catch ex As Exception
            ' Unable to load the Assembly or enumerate types -- just ignore
        End Try
    Next

이 경우에도, 어딘가에서 실패를 기록하는 것이 아마도 개선 일 것임을 인정합니다.


답변

빈 캐치 블록은 일반적으로 코더가 실제로 무엇을하는지 알지 못하기 때문에 삽입됩니다. 우리 조직에서는 빈 캐치 블록에 예외없이 아무 것도하지 않는 것이 좋은 생각 인 이유를 설명해야합니다.

관련 메모에서 대부분의 사람들은 try {} 블록 뒤에 catch {} 또는 finally {}가 올 수 있다는 것을 알지 못하며 하나만 필요합니다.


답변

예외는 실제로 예외가있는 경우에만 발생해야합니다. 표준을 넘어서는 일이 발생합니다. 빈 캐치 블록은 기본적으로 “나쁜 일이 일어나고 있지만 신경 쓰지 않습니다”라고 말합니다. 이것은 나쁜 생각입니다.

예외를 처리하지 않으려면 예외를 처리 할 수있는 코드에 도달 할 때까지 위쪽으로 전파하십시오. 예외를 처리 할 수있는 것이 없으면 응용 프로그램을 중단해야합니다.


답변

특정 이유로 인해 발생 하는 특정 예외 유형을 발견하면 예외가 발생할 것으로 예상되며 실제로 예외를 기대할 필요는 없습니다.

그러나이 경우에도 디버그 메시지가 순서가있을 수 있습니다.