당신이 붙잡힌 것처럼 보이는 것은 그들의 케이크를 먹고 그것을 먹는 누군가의 특정한 지옥입니다.
RAII 및 예외는 함께 진행되도록 설계되었습니다. RAII는하지 않는 수단이다 이 많이 쓰고 catch(...)
정리를 할 수있는 문을. 물론 자동으로 발생합니다. 예외는 RAII 객체로 작업 할 수있는 유일한 방법입니다. 생성자는 성공하거나 던질 수만 있습니다 (또는 객체를 오류 상태로 만들지 만 누가 원합니까?).
catch
문은 두 가지 중 하나를 수행 할 수 오류 또는 예외적 인 상황을 처리, 또는 정리 작업을 수행. 때로는 두 가지 모두 catch
를 수행 하지만 모든 진술은 적어도 하나를 수행하기 위해 존재합니다.
catch(...)
적절한 예외 처리를 수행 할 수 없습니다. 당신은 예외가 무엇인지 모른다; 예외에 대한 정보를 얻을 수 없습니다. 당신은 예외에 의해 발생했다는 사실이 아닌 전혀 정보가 없다 어떤 특정 코드 블록 내에서합니다. 그러한 블록에서 할 수있는 유일한 합법적 인 일은 정리를하는 것입니다. 그리고 이는 정리가 끝날 때 예외를 다시 발생시키는 것을 의미합니다.
예외 처리와 관련하여 RAII가 제공하는 것은 무료 정리입니다. 모든 것이 RAII로 올바르게 캡슐화되면 모든 것이 올바르게 정리됩니다. 더 이상 catch
명령문을 정리할 필요가 없습니다 . 어떤 경우에도 catch(...)
진술서 를 작성할 이유가 없습니다 .
그래서 나는 그 동의 할 것입니다 catch(...)
... 대부분 악한 잠정적으로 .
해당 조항은 RAII를 올바르게 사용하는 것입니다. 그것을하지 않고 있기 때문에, 당신은 필요 어떤 정리를 할 수 있기를. 주변을 돌아 다니지 않습니다. 정리 작업을 수행 할 수 있어야합니다. 예외를 던질 때 코드가 적절한 상태를 유지하도록해야합니다. 그리고 그렇게 catch(...)
하는 데 중요한 도구입니다.
다른 것 없이는 가질 수 없습니다. RAII 와 catch(...)
나쁘다고 말할 수는 없습니다 . 이 중 하나 이상이 필요합니다. 그렇지 않으면 예외 안전하지 않습니다.
물론 catch(...)
RAII조차도 추방 할 수없는 타당하지만 드물게 사용 exception_ptr
됩니다. 다른 사람에게 전달하는 것입니다. 일반적으로 promise/future
또는 유사한 인터페이스를 통해 .
제 동료들은 예외가 발생하는 것을 항상 알고 있어야하며 항상 다음과 같은 구문을 사용할 수 있다고 말합니다.
당신의 동료는 바보입니다 (또는 끔찍하게 무지합니다). 그가 작성한 복사 및 붙여 넣기 코드의 양으로 인해 이는 즉시 명백해야합니다. 각각의 catch 문에 대한 정리는 정확히 동일 합니다. 가독성은 말할 것도없고 유지 보수의 악몽입니다.
요컨대 이것은 RAII 가 해결하기 위해 만들어진 문제입니다 (다른 문제를 해결하지는 않습니다).
이 개념에 대해 저를 혼동하는 것은 대부분의 사람들이 RAII가 나쁘다는 주장에 일반적으로 반대라는 것입니다. 일반적으로 인수는 "RAII는 생성자 실패를 알리기 위해 예외를 사용해야하기 때문에 나쁘다. 그러나 안전하지 않기 때문에 예외를 던질 수 없으며 catch
모든 것을 정리하기 위해 많은 문장을 가져야 한다." RAII가 부족한 RAII의 문제점을 해결 하기 때문에 이는 잘못된 주장 입니다.
아마도 그는 세부 사항을 숨기므로 RAII에 반대합니다. 소멸자 호출은 자동 변수에 즉시 표시되지 않습니다. 따라서 암시 적으로 호출되는 코드를 얻습니다. 일부 프로그래머는 정말로 그것을 싫어합니다. 분명히, 그들이 3 개의 catch
문장을 가지고 있다고 생각할 때까지는, 복사-붙여 넣기 코드로 같은 일을하는 것이 더 좋습니다.
...
있는 동안 내 질문의 초점은"나는 더 나은 캐치를해야 하는가 "...
또는<specific exception>
rethrowing 전에"