예외처리(try, catch)와 함수리턴값..
글쓴이: icanfly / 작성시간: 금, 2005/01/21 - 9:26오전
구조적 예외처리라고 요즘은 try...catch를 많이 사용합니다만..
예전처럼 함수의 리턴값으로 결과를 알아보는것과 정확하게
어떤 면에서 이익인지 잘 모르겠더군요. 설명해논 책도 못봤고..
try { SomeFunction(); }catch(){ .... }
하고..
r = SomeFunction(); switch(r) { case 0: ... break; case 1: ... break; ...... }
와의 차이에 대해 ..
제가 생각하기론 위와 같이 예외처리를 사용하면, 프로그래머가 직접처리해준 예외말고 다른 예외가 발생해도
예외처리 과정의 위로위로 전파되면서, 마지막에가서는 결국
상위클래스등에서 마련한 기본적인 예외처리 루틴이 작동하게되는
장점이 있고, 리턴값의 경우는 처리하지 않은 문제에 대해서 시스템이 죽어버린다든지하는 치명적인 결과를 초래할수 있다..
정도로 생각하고 있는데요..맞는건지 잘 모르겠습니다.
그럼..
Forums:
저는..아래 처럼 처리하는것 보다는..[code:1]if
저는..아래 처럼 처리하는것 보다는..
위의 것이 더 단순해 보이고..
보기에도 편해 보여서.. 사용합니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
robust를 추구하기 위한 feature를 언어수준에서 제공한 것입니다
robust를 추구하기 위한 feature를 언어수준에서 제공한 것입니다.
의 한계는 some()이 정상동작한다는 가정이 들어가 있는 코드라는 것이지요.some()을 신뢰할 수 있다면 좋은데, some()이 리턴을 제대로 안해주면 어떻게 할까요?
some()의 소스를 손본다? some()의 소스를 구할 수 없다면? 다시짠다? 음.....
some()내부에서 폴트가 나왔다면이라는 말이 보다 분명한듯합니다.
some()내부에서 폴트가 나왔다면이라는 말이 보다 분명한듯합니다.
예외는 비정상적인 상황이 발생했을 때 이를 감지하는 부분과 처리하는 부분
예외는 비정상적인 상황이 발생했을 때 이를 감지하는 부분과 처리하는 부분을
분리하기 위한 것입니다. 이 두 부분이 섞여버리면 코드가 복잡해지고 그것은
바로 잘못된 코딩을 하기 쉽다는 뜻이 됩니다. 정상적인 상황에서의 코드와 비정상적인
상황에서의 코드를 분리함으로써 가독성이 좋아지고 유지보수에 도움이 되지요.
그리고 stack unwinding도 기존의 방법과 큰 차이입니다.
그런데 예외 메커니즘을 제대로 쓰기는 쉽지 않습니다. 예외에 안전한 코드를
작성하는 것은 생각보다 까다롭고 그 자체로 큰 이슈가 됩니다. 이와 관련하여
흔히 RAII(resource acquisition is initialization)라고 하는 테크닉이 중요하게
다루어집니다. 다음은 TC++PL에 실려있는 예입니다.
보시면 예외가 발생했을 때와 정상적인 상황에서 모두 fclose()를 해주어야 하는데
이런 식의 코딩은 실수를 하기 쉽습니다. RAII를 적용하여 자원의 획득과 반환을
자동적으로 처리하는 방법은 아래와 같습니다.
이렇게 하면 예외가 발생해도 자원의 획득과 반환이 자동적으로 처리됩니다.
스마트 포인터도 이와 비슷한 맥락이라고 볼 수 있습니다.
Re: 예외처리(try, catch)와 함수리턴값..
effective c++ 혹은 more effective c++ 를 참고하시면 도움이 될듯 하네요
exception은 에러 처리를 구조적으로 단순화시켜 준다는 장점이 있습
exception은 에러 처리를 구조적으로 단순화시켜 준다는 장점이 있습니다만, 이를 제대로 사용하기에는 많은 노력이 들어간다는 것이 가장 큰 위험요소라고 봅니다. 성능 저하의 문제점도 내포하고 있고요.
John Robbins의 Debugging Applications 책을 보더라도 잘못된 예외 처리가 자신의 밥줄이라고 할 만큼 제대로 사용하기엔 그만큼 힘들다고 봅니다.
개인적으론 에러 코드를 이용한 에러 처리를 선호합니다.
댓글 달기