C++이나 Java의 try - catch 예외처리 기능을 C에서도 사용할 수 있도록 만들어놓은 라이브러리나 try-catch구현 방법좀 알려주세요~!

이소희의 이미지

님들은 unix 나 linux 에서 C프로그래밍 할때 예외처리 어떤식으로 하시나요?

조언 부탁 드립니다.

좋은밤 보내세요^^

익명 사용자의 이미지

setjmp/longjmp를 쓰면 얼추 비슷하게 할 수는 있지만
실제로 쓰는 건 못봤습니다.

익명 사용자의 이미지

semmal의 이미지

C라는 언어의 목적을 생각해보면 예외처리는 어울리지 않는 것 같습니다.
물론 있으면 없는 것보다는 편하고 좋겠지요. 하지만 예외 처리를 하려면 당연히 메모리를 트레이스하거나 관리할 수 있는 메커니즘이 필요합니다. 현대의 프로그래밍에서 C언어가 쓰이는 목적 대부분이 어셈블리어와 크게 다를 바 없다는 것을 상기하면 이런 메커니즘은 너무 덩치가 크고 불필요한 기능이 될지도 모릅니다.
윗분이 말씀하셨듯 setjmp와 longjmp는 그나마 유사하게 동작하지만, 메모리 관리가 전혀 안됩니다. 굳이 쓰시겠다면 이런 관리는 손으로 직접하셔야 합니다. 이렇게 직접 예외처리를 하는 것에 대해서는 꽤나 오래전에 많은 고수분들이 나름대로 방법을 강구한 것으로 알고 있습니다.(아마 뉴스그룹을 뒤져보면 찾게될지 모릅니다.) 하지만 오늘 날에 와서는 예외 처리를 정말 써야하는 프로그램이라면 C++나 Java 등의 예외처리를 지원하는 다른 언어를 쓰면 쉽게 해결됩니다.
정말 이런저런 수많은 이유에도 불구하고 C에서 예외처리를 쓰시고 싶으십니까?
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

semmal의 이미지

역시 없을리가 없군요. 제가 부정적이었나 보네요.
요즘들어 너무나도 많이 게을러진터라, 찾아보지도 않고 그냥 대충 갈겨 써버린게 부끄럽네요.
조금 더 분발해야겠습니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

이소희의 이미지

내 삶속에 던져진 나.
좋은 정보 감사 드립니다.

행복한 하루 보내세요~^^

내 삶속에 던져진 나.

thyoo의 이미지

먼저 예외 처리가 왜 생겨났지 생각해야 합니다.

여러 이유가 있지만 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 는 비교 불가입니다.

thyoo의 이미지

그게 때로는 큰 곤경에 처하게 하기도 하지요.

http://www.savive.com/casestudy/ariane5.html

___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.