C라는 언어의 목적을 생각해보면 예외처리는 어울리지 않는 것 같습니다.
물론 있으면 없는 것보다는 편하고 좋겠지요. 하지만 예외 처리를 하려면 당연히 메모리를 트레이스하거나 관리할 수 있는 메커니즘이 필요합니다. 현대의 프로그래밍에서 C언어가 쓰이는 목적 대부분이 어셈블리어와 크게 다를 바 없다는 것을 상기하면 이런 메커니즘은 너무 덩치가 크고 불필요한 기능이 될지도 모릅니다.
윗분이 말씀하셨듯 setjmp와 longjmp는 그나마 유사하게 동작하지만, 메모리 관리가 전혀 안됩니다. 굳이 쓰시겠다면 이런 관리는 손으로 직접하셔야 합니다. 이렇게 직접 예외처리를 하는 것에 대해서는 꽤나 오래전에 많은 고수분들이 나름대로 방법을 강구한 것으로 알고 있습니다.(아마 뉴스그룹을 뒤져보면 찾게될지 모릅니다.) 하지만 오늘 날에 와서는 예외 처리를 정말 써야하는 프로그램이라면 C++나 Java 등의 예외처리를 지원하는 다른 언어를 쓰면 쉽게 해결됩니다.
정말 이런저런 수많은 이유에도 불구하고 C에서 예외처리를 쓰시고 싶으십니까?
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
역시 없을리가 없군요. 제가 부정적이었나 보네요.
요즘들어 너무나도 많이 게을러진터라, 찾아보지도 않고 그냥 대충 갈겨 써버린게 부끄럽네요.
조금 더 분발해야겠습니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
여러 이유가 있지만 C++ 에 있어서
익셉션이 존재하는 가장 큰 이유는
Stack Unwinding입니다.
C에서는
복잡한 함수 중첩 호출에서 탈출할 때
setjmp/longjmp를 사용합니다.
그런데 문제는 C++에서는 일반적으로
단순히 longjmp하면 안된다는 겁니다.
중첩 함수 콜은
Stack Frame 역시 중첩돼 있다는 것을
의미하고 각 Stack Frame (즉, Scope)이
끝날 때 (함수 리턴) 반드시 호출해야 하는
(class type의 지역 변수의) 소멸자가 있기 마련입니다.
그런데 연쇄 함수 리턴(stack unwinding) 대신
한번에 jump해 버리면 소멸자들이 호출될 기회를 잃고
그로 인해서 리소스 반환이 안되어
메모리 누수등이 발생할 수 있읍니다.
예외를 발생 시키면 longjmp와 달리
Stack Frame Chain을 따라
차례대로 Stack을 Unwind해서 소멸자들을 호출해 줍니다.
제 결론도,
C에서는 setjmp/longjmp가 있으므로
예외 처리는 불필요하다 입니다.
소스에서 예외 처리를 정상 처리와
분리할 수 있어서 좋다고들 하는데
저한테는 try catch가 if else보다
가독성이나 뭐로 보나 별로 나아 뵈지는 않더군요.
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
setjmp/longjmp를 쓰면
setjmp/longjmp를 쓰면 얼추 비슷하게 할 수는 있지만
실제로 쓰는 건 못봤습니다.
http://en.wikipedia.org/wiki/
http://en.wikipedia.org/wiki/Setjmp.h
C에서 예외처리
C라는 언어의 목적을 생각해보면 예외처리는 어울리지 않는 것 같습니다.
물론 있으면 없는 것보다는 편하고 좋겠지요. 하지만 예외 처리를 하려면 당연히 메모리를 트레이스하거나 관리할 수 있는 메커니즘이 필요합니다. 현대의 프로그래밍에서 C언어가 쓰이는 목적 대부분이 어셈블리어와 크게 다를 바 없다는 것을 상기하면 이런 메커니즘은 너무 덩치가 크고 불필요한 기능이 될지도 모릅니다.
윗분이 말씀하셨듯 setjmp와 longjmp는 그나마 유사하게 동작하지만, 메모리 관리가 전혀 안됩니다. 굳이 쓰시겠다면 이런 관리는 손으로 직접하셔야 합니다. 이렇게 직접 예외처리를 하는 것에 대해서는 꽤나 오래전에 많은 고수분들이 나름대로 방법을 강구한 것으로 알고 있습니다.(아마 뉴스그룹을 뒤져보면 찾게될지 모릅니다.) 하지만 오늘 날에 와서는 예외 처리를 정말 써야하는 프로그램이라면 C++나 Java 등의 예외처리를 지원하는 다른 언어를 쓰면 쉽게 해결됩니다.
정말 이런저런 수많은 이유에도 불구하고 C에서 예외처리를 쓰시고 싶으십니까?
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
http://users.footprints.net/~
http://users.footprints.net/~kaz/kazlib_doc/node161.html
오호 멋진데요
역시 없을리가 없군요. 제가 부정적이었나 보네요.
요즘들어 너무나도 많이 게을러진터라, 찾아보지도 않고 그냥 대충 갈겨 써버린게 부끄럽네요.
조금 더 분발해야겠습니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
감사합니다.~
내 삶속에 던져진 나.
좋은 정보 감사 드립니다.
행복한 하루 보내세요~^^
내 삶속에 던져진 나.
C++ 관점
먼저 예외 처리가 왜 생겨났지 생각해야 합니다.
여러 이유가 있지만 C++ 에 있어서
익셉션이 존재하는 가장 큰 이유는
Stack Unwinding입니다.
C에서는
복잡한 함수 중첩 호출에서 탈출할 때
setjmp/longjmp를 사용합니다.
그런데 문제는 C++에서는 일반적으로
단순히 longjmp하면 안된다는 겁니다.
중첩 함수 콜은
Stack Frame 역시 중첩돼 있다는 것을
의미하고 각 Stack Frame (즉, Scope)이
끝날 때 (함수 리턴) 반드시 호출해야 하는
(class type의 지역 변수의) 소멸자가 있기 마련입니다.
그런데 연쇄 함수 리턴(stack unwinding) 대신
한번에 jump해 버리면 소멸자들이 호출될 기회를 잃고
그로 인해서 리소스 반환이 안되어
메모리 누수등이 발생할 수 있읍니다.
예외를 발생 시키면 longjmp와 달리
Stack Frame Chain을 따라
차례대로 Stack을 Unwind해서 소멸자들을 호출해 줍니다.
제 결론도,
C에서는 setjmp/longjmp가 있으므로
예외 처리는 불필요하다 입니다.
소스에서 예외 처리를 정상 처리와
분리할 수 있어서 좋다고들 하는데
저한테는 try catch가 if else보다
가독성이나 뭐로 보나 별로 나아 뵈지는 않더군요.
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
내가 부른 함수가
내가 부른 함수가 에러가 났을때의 처리를 자신을 부른 함수에게 떠맏기고 신경을 끌수 있다는 점에서
try catch 와 if else 는 비교 불가입니다.
그게 때로는 큰
그게 때로는 큰 곤경에 처하게 하기도 하지요.
http://www.savive.com/casestudy/ariane5.html
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
댓글 달기