예외처리(try, catch)와 함수리턴값..

icanfly의 이미지

구조적 예외처리라고 요즘은 try...catch를 많이 사용합니다만..

예전처럼 함수의 리턴값으로 결과를 알아보는것과 정확하게

어떤 면에서 이익인지 잘 모르겠더군요. 설명해논 책도 못봤고..

 try { 
       SomeFunction();
 }catch(){
       ....
 }
 

하고..

     r = SomeFunction();

     switch(r)
    {
         case 0: ... break;
         case 1: ... break;
          ......
    }
 

와의 차이에 대해 ..

제가 생각하기론 위와 같이 예외처리를 사용하면, 프로그래머가 직접처리해준 예외말고 다른 예외가 발생해도
예외처리 과정의 위로위로 전파되면서, 마지막에가서는 결국
상위클래스등에서 마련한 기본적인 예외처리 루틴이 작동하게되는
장점이 있고, 리턴값의 경우는 처리하지 않은 문제에 대해서 시스템이 죽어버린다든지하는 치명적인 결과를 초래할수 있다..
정도로 생각하고 있는데요..맞는건지 잘 모르겠습니다.

그럼..

Fe.head의 이미지

저는..아래 처럼 처리하는것 보다는..

if(Some1() == TRUE)
{
       if(Some2() == TRUE)
        {
               if(Some3() == TRUE)
               {
                     ...
                     return TRUE;
               }
                else
                {
                       ErrorMsg3;
                 }
          }
          else
         {
                  ErrMsg2;
          }

}
else
{
        ErrMsg1;
}

return FALSE;

BOOL ret = TRUE;
try
{
     some1();
     some2();
     some3();
}
catch( string errmsg)
{
      ShowMessag(errmsg);
       ret = FALSE;
}

return ret;

위의 것이 더 단순해 보이고..
보기에도 편해 보여서.. 사용합니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

익명 사용자의 이미지

robust를 추구하기 위한 feature를 언어수준에서 제공한 것입니다.

int va;
int *ptr=&va;
if (some()){
 a();
 *(ptr + 100)=777;
}
else {
 b();
}
의 한계는 some()이 정상동작한다는 가정이 들어가 있는 코드라는 것이지요.

some()을 신뢰할 수 있다면 좋은데, some()이 리턴을 제대로 안해주면 어떻게 할까요?
some()의 소스를 손본다? some()의 소스를 구할 수 없다면? 다시짠다? 음.....

익명 사용자의 이미지

some()내부에서 폴트가 나왔다면이라는 말이 보다 분명한듯합니다.

doldori의 이미지

예외는 비정상적인 상황이 발생했을 때 이를 감지하는 부분과 처리하는 부분을
분리하기 위한 것입니다. 이 두 부분이 섞여버리면 코드가 복잡해지고 그것은
바로 잘못된 코딩을 하기 쉽다는 뜻이 됩니다. 정상적인 상황에서의 코드와 비정상적인
상황에서의 코드를 분리함으로써 가독성이 좋아지고 유지보수에 도움이 되지요.
그리고 stack unwinding도 기존의 방법과 큰 차이입니다.
그런데 예외 메커니즘을 제대로 쓰기는 쉽지 않습니다. 예외에 안전한 코드를
작성하는 것은 생각보다 까다롭고 그 자체로 큰 이슈가 됩니다. 이와 관련하여
흔히 RAII(resource acquisition is initialization)라고 하는 테크닉이 중요하게
다루어집니다. 다음은 TC++PL에 실려있는 예입니다.

void use_file(const char* fn)
{
    FILE* f = fopen(fn, "r");
    try {
        // use f
    }
    catch (...) {
        fclose(f);
        throw;
    }
    fclose(f);
}

보시면 예외가 발생했을 때와 정상적인 상황에서 모두 fclose()를 해주어야 하는데
이런 식의 코딩은 실수를 하기 쉽습니다. RAII를 적용하여 자원의 획득과 반환을
자동적으로 처리하는 방법은 아래와 같습니다.
class File_ptr
{
    FILE* p;
public:
    File_ptr(const char* n, const char* a) { p = fopen(n, a); }
    File_ptr(FILE* pp) { p = pp; }
    ~File_ptr() { fclose(p); }
    operator FILE*() { return p; }
};

void use_file(const char* fn)
{
    File_ptr f(fn, "r");
    // use f
}

이렇게 하면 예외가 발생해도 자원의 획득과 반환이 자동적으로 처리됩니다.
스마트 포인터도 이와 비슷한 맥락이라고 볼 수 있습니다.
ssehoony의 이미지

icanfly wrote:

어떤 면에서 이익인지 잘 모르겠더군요. 설명해논 책도 못봤고..

effective c++ 혹은 more effective c++ 를 참고하시면 도움이 될듯 하네요

kcando의 이미지

exception은 에러 처리를 구조적으로 단순화시켜 준다는 장점이 있습니다만, 이를 제대로 사용하기에는 많은 노력이 들어간다는 것이 가장 큰 위험요소라고 봅니다. 성능 저하의 문제점도 내포하고 있고요.

John Robbins의 Debugging Applications 책을 보더라도 잘못된 예외 처리가 자신의 밥줄이라고 할 만큼 제대로 사용하기엔 그만큼 힘들다고 봅니다.

개인적으론 에러 코드를 이용한 에러 처리를 선호합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.