try catch를 꼭 써야한다면 그 이유는 무엇일까요?

sangheon의 이미지

try catch를 사용하기도 하고 안 하기도 하는데 try catch를 꼭 써야하는 이유를 아직 느끼지 못했습니다.

그냥 return 값을 사용해서 처리하는게 더 빠르고 에러 처리도 더 간편한 경우가 많더군요.

OO를 하니까 그냥 아무 생각없이 관습적으로 쓰게 되는 것 같은데요.

try catch를 꼭 써야하는 이유가 있다면 무엇이 있을까요?

bushi의 이미지

몇 시간 전에 다른 걸 검색하다가 봤던 페이지 입니다.
http://stackoverflow.com/questions/307610/how-do-exceptions-work-behind-the-scenes-in-c

꼭 써야 한다기 보다... return 값 검사하는 것에 비해 손해볼 것 하나도 없으니 편하게 써라 정도.

OTL

empty2fill의 이미지

관련 구글 구룹스입니다.

I keep running into long term c++ programmers who refuse to use exceptions
http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/e109e8b5a792dd91/3e5e2cd91461bf71?hl=en&lnk=gst&q=refuse#3e5e2cd91461bf71

위 링크에도 언급잉 있는데요. 라이브러리를 만드는 관점에서 생각해 보겠습니다.

우선 리턴 구문'만'을 쓰면, 무엇이 올바른 상황이고 무엇이 예외 상황인지 결정하는 것을

라이브러리 사용자(함수 호출자)에게 맡길 수 있는데요.

try, catch, throw를 쓰게되면, 무엇이 예외 상황인지를 라이브러리 설계자가 미리 정의해야 하는데,

라이브러리 사용자가 이를 예외 상황으로 받아들이지 않을 수 있습니다.

그렇게 되면 정상 코드와 예외 코드가 뒤죽박죽되어 더 알아보기 힘들게 되죠.
(일반적인 예가 아니라, 특별한 예입니다)

try, catch, throw의 목적이 예외 처리 코드와 정상 처리 코드를 분리하여 코드의 엘레강스(?) 높이는 것인데요.

무엇이 정상이고 무엇이 예외인지 나누는 것이 생각보다 쉽지 않은 것 같습니다.

뭐 논쟁이 될 수 있는 내용입니다.

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

feanor의 이미지

C++ 예외는 악입니다. 사탄이 만들었어요.
http://www.yosefk.com/c++fqa/exceptions.html

사실 C++ 전체가 다 그렇습니다만...

conan의 이미지

C++ 을 처음 봤을때 이걸로 프로그램을 만들수는 있는거야? 라고 생각했었지요..ㅜ,ㅜ

조금 다른 내용이지만 대부분의 JIT 구현들은 거의모두 C++ 로 만들지요, 그래서인지 영원히 쌩까지는 못하겠더군요... (jit 을 직접 다루지는 않지만 관심이 맣아서요..)
지금은 보지 않지만 spidermonkey 소스로 작업을 한적이 있는데 얼마전 오랜만에 소스를 받아봤더니 jit 이 들어가면서 모두 C++ 로 바뀌었더군요..

python 소스를 받아서 살펴보니 아직 python 은 C 로 되어있더군요. 아직 jit 관련해서는 안들어가 있는건지 모르겠지만 이녀석은 C++ 로 바뀌지 않았으면 하네요...

High Risk & High Return ~

feanor의 이미지

안됐지만 구글에서 진행하고 있는 파이썬 JIT 프로젝트인 Unladen Swallow가 C++로 되어 있습니다.

sloth_의 이미지

if(예외가 발생하면)
goto 처리루틴;

이런 방법을 goto 쓴다구 욕먹지않으면서 쓸 수 있다는거 아닐까요^^

아.. 재미없는 농담이었습니다. try~catch exception handling 아이디어를 폄하하거나 의미없는 논쟁을 할 생각은 없었으니, 기분 나쁘신분 계시다면 너그럽게 용서해 주시기를

jick의 이미지

꼭 써야하는 이유라기보단, 쓰면 좋은 상황이 있고 안 그런 상황이 있겠죠.

(뭐 아무도 관심없으시겠...지만..-.-) 구글에서는 C++로 프로그래밍할 때 exception을 안씁니다.
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions

Scarecrow의 이미지

다른 언어에서 try catch를 쓰는건 나쁘지 않습니다만...
C++의 그것은 정말 쓸모가 의심스럽더군요.

왜냐면 C언어에서 내부적으로 에러로 처리하는 것(예: 잘못된 메모리 접근)은
절대 C++에서 예외처리로 다루지 못합니다.

winner의 이미지

C++안의 C에서 처리하는 부분을 다루지 못한다는 점이 문제라고 생각하시는듯...
다른 언어에서는 어떤 점이 좋은지 알려주실 수 있나요?

winner의 이미지

우선 함수 반환형식을 의미 그대로 쓰는 형태를 취할 수 있다는게 좋음.... -_-.
반환형태가 아니라 참조자나, pointer의 경우는 잘 안 쓰는군요.

lovewar의 이미지

예전에 계산기를 흉내내는 것을 해야 할때가 있었습니다.
그때 Error에 대한 처리를 Exception 개념을 사용하니 편했던것 같습니다.

그때 사용한 로직은 다음과 같습니다:
1. 수식을 입력받는다.
2. 수식의 유효성을 검증한다.
2.1. 만약 수식이 유효하지 않으면 다음 로직을 수행한다.
3. 수식을 평가한다.
4. 평가된 수식의 결과로 다음 로직을 수행한다.

relationExpr = getRelatonxpression();
try {
 int retval = getValue(relationExpr);
 calculate(retval, count);
} catch (..)

여기서 getValue 함수가 수식 유효성점검을 해야 했기에 error에 대한 처리는 Exception으로 처리하는 것이 손쉬웠던것 같습니다.

unsouled의 이미지

아무도 자바는 언급하지 않으셔서.. 한마디 쓰자면
자바는 checked exception 때문에 더 골때립니다.
컴파일 타임에 예외를 검사하기 때문에 개발자가 모든 예외상황에 대해 알아야 하고..
반드시 catch 되거나 throw 되어야만 해서 예외를 처리하는 부분을 공통화 시키기도 어렵고, 코드를 상당히 지저분하게 만듭니다.

덕분에 자바 코드에서는 예외를 잡아 로그 찍기만 하거나 심지어 예외를 집어 삼키는 코드들이 참 빈번하게 보이더군요.

winner의 이미지

그런데 그거 Web framework에서 쓴다고 하던데... 저는 Java를 거의 안해서 모르겠어요.