developer tip

새로운 std :: exception을 던져 std :: exception을 던져

copycodes 2020. 8. 13. 23:34
반응형

새로운 std :: exception을 던져 std :: exception을 던져


몇 가지 코드를 보면서 우연히 발견했습니다.

throw /*-->*/new std::exception ("//...

그리고 나는 항상 당신이 필요하지 않거나 new여기에서 사용해서는 안된다고 생각했습니다 .
올바른 방법은 무엇입니까? 차이가 있다면 둘 다 괜찮습니까?

내가 볼 수있는 BTW는 PowerShell 부스트 라이브러리를 사용하여 throw new.

추신 또한 사용하는 일부 CLI 코드를 찾았습니다 throw gcnew. 그 확인은?


예외를 throw하고 catch하는 일반적인 방법은 예외 개체를 throw하고 참조 (일반적으로 const참조) 로 포착하는 것 입니다. C ++ 언어를 사용하려면 컴파일러가 예외 개체를 생성하고 적절한 시간에 적절하게 정리하기 위해 적절한 코드를 생성해야합니다.

동적으로 할당 된 개체에 대한 포인터를 던지는 것은 결코 좋은 생각이 아닙니다. 예외는 오류 상황에서보다 강력한 코드를 작성할 수 있도록합니다. 일반적인 방식으로 예외 객체를 던지면 올바른 유형을 명명하는 catch 절에 의해 포착 catch (...)되는지, 다시 던 졌는지 여부에 관계없이 적절한 시간에 올바르게 파괴되는지 확인할 수 있습니다. (아무것도 잡히지 않는 유일한 예외는 당신이 그것을 보는 방법에 관계없이 이것은 복구 불가능한 상황입니다.)

동적으로 할당 된 객체에 대한 포인터를 던지면 예외를 던지고 싶은 지점에서 호출 스택이 어떤 모양이든간에 올바른 포인터 유형을 명명하고 적절한 delete호출 이있는 catch 블록이 있는지 확인해야합니다 . catch (...)해당 블록이 예외를 다시 throw하지 않는 한 예외를 포착해서는 안되며 , 예외를 올바르게 처리하는 또 다른 catch 블록이 포착됩니다.

사실상 이것은 강력한 코드를 더 쉽게 작성하고 모든 상황에서 올바른 코드를 작성하는 것을 매우 어렵게 만드는 예외 처리 기능을 사용했음을 의미합니다. 이것은이 기능을 기대하지 않는 클라이언트 코드에 대한 라이브러리 코드로 작동하는 것이 거의 불가능하다는 문제를 제쳐두고 있습니다.


new예외를 던질 때 사용할 필요가 없습니다 .

그냥 써:

throw yourexception(yourmessage);

다음과 같이 잡으십시오.

catch(yourexception const & e)
{
      //your code (probably logging related code)
}

주의 yourexception에서 파생한다 std::exception직접 또는 간접적으로.


던지기는 new std::exception호출 사이트가를 잡을 것으로 예상되는 경우 올바른 std::exception*. 그러나 아무도 예외에 대한 포인터를 잡을 것으로 기대하지 않습니다. 그것이 당신의 함수가하는 일을 문서화하고 사람들이 문서를 읽더라도, 그들은 여전히 ​​잊고 std::exception대신 객체에 대한 참조를 잡으려고 시도 할 수 있습니다.


C ++ FAQ에는 이에 대한 좋은 토론이 있습니다.

  1. https://isocpp.org/wiki/faq/exceptions#what-to-catch
  2. https://isocpp.org/wiki/faq/exceptions#catch-by-ptr-in-mfc

기본적으로 "그럴만 한 이유가없는 한 참조로 잡으십시오. 값으로 잡는 것을 피하십시오. 그렇게하면 복사본이 만들어지고 복사본이 던져진 것과 다른 동작을 할 수 있기 때문입니다. 아주 특별한 상황에서만 포인터로 잡아야합니다. "

참고 URL : https://stackoverflow.com/questions/10948316/throw-new-stdexception-vs-throw-stdexception

반응형