2010-06-24 3 views
9

예외 후 값이 return이면 어떤 점에서 유익합니까? 그렇지 않다면 return 문을 생략하고 어떻게 든 컴파일러 오류 C4715: not all control paths return a value을 제거 할 수 있습니까?예외를 던진 후 돌아 오기

미리 감사드립니다.

편집 : (샘플 코드)

for (ushort i = 0; i < itsNumUnits; ++i) 
    if (unitFormation[i] == unit) 
    { 
     return unitSetup[i]; 
    } 
    else 
     throw unit; 

return 0; 
+2

루틴의 마지막 문이'throw'이고 여전히 경고 메시지가 표시되면 코드 샘플을 게시하고 사용중인 컴파일러를 말해야합니다. –

+0

내가 염두에 두었던 것은 그 질문에 추가 한 것입니다 ... 죄송합니다. 이전에 샘플을 추가하지 않았습니다. –

+0

컴파일러 경고는 언어 나 표준에는 문제가되지 않지만 컴파일러에는 문제가 없습니다. 나는 당신이 오류 메시지의 형태로 Visual C++의 일부 버전을 사용하고 있다고 가정하지만, 어떤 버전인지 알면 도움이 될 것입니다. –

답변

7

예외 던져 후 값을 반환 할 필요가 없습니다. 이 오류가 발생하면 예외를 throw하지 않고 코드가 도달 할 수있는 경로를 확인해야합니다 (예 : 예외가 또는 something의 값에 따라 발생되지 않을 수 있기 때문에 "만약"의 "다른"지점에서 값을 반환하지 못하면

if (something) 
    throw Exception; 
else 
    return value; 

은 컴파일 오류가 발생합니다.

+3

MSVC는 C4715를 제공합니다. 모든 경로가 항상 throw되기 때문에 반환 할 수는 없지만 모든 제어 경로가 코드의 if 경로에 대한 값을 반환하는 것은 아닙니다. – Pait

2

throw 자체가 함수 실행을 종료합니다. 그러나 함수가 값을 반환하고 예외가 throw되지 않으면 값을 반환해야합니다. 예 :

bool foo(bool _flag) throw(...) 
{ 
    if (_flag) 
    { 
     throw "foo is throwing an exception"; 
    } 
    return true; 
} 
-1

던진 후에는 catch에서 끝납니다 (throw는 실행되지 않습니다). 실행되는 유일한 블록은 마침내입니다. 당신이이 같은 갈 위에서 설명한 것처럼 뭔가를 달성하려면

: 나는 좋은 아이디어를 생각하지 않는 방식 있도록

object returnVal = null; // the bad 
try 
{ 
    //some code here 
    throw new Exception(); // something bad happened 
    //some more code 
    returnVal = new object(); // the good 
} 
catch(Exception ex) 
{ 
    // log, try to recover etc. 
    // maybe it`s a good idea not to throw it away if you can handle it here! 
} 
return returnVal; // either the good or the bad (never the ugly!) 

경고의 C#을 상당 컴파일러 오류입니다 컴파일러 경고를 없애고 문제를 해결하는 것입니다.

감사합니다 ...

+0

C++에는'finally'가 없으므로 예외를 잡는 것에 대한 언급이 없습니다. 그리고 컴파일러가 무조건'throw '후에'return'을 가지지 않아서 경고를 생성하면 경고는 가짜입니다. –

+5

C++ 용으로 매우 나쁜 코드인데, 우리는'object','null' 또는'new'를 모두 가지고 있지 않습니다 ... –

+0

사실 C#이지만 거기에는 약간의 유사성이 있다고 생각합니다 ... – Padel

0

수있는 가장 가까운 해당 "반환"의 값을뿐만 아니라 함수가 예외를 던지기 전에 객체를 포인터에 기록되거나 참조 할 때 예외가 던져 :

void my_func(int& ret) 
{ 
    ret = 0; 

    for (ushort i = 0; i < itsNumUnits; ++i) { 
     if (unitFormation[i] == unit) { 
      ret = unitSetup[i]; 
      return; 
     } 
     else { 
      throw unit; 
     } 
    } 
} 

그러나이 패턴은 오류가 발생하기 쉽고 거의 유용하지 않습니다. 사용하기 전에주의 깊게 생각하십시오.

관련 문제