2014-01-27 3 views
0

그냥이 질문 : Is it bad to use exceptions to end function?.예외없이 오류의 세부 정보를 반환하십시오

이제 예외를 반환해서는 안된다는 사실을 알고 있습니다. 그렇다면 오류를 반환하는 올바른 방법은 무엇입니까?

예외를 반환 할 때 무언가가 실패하면 함수의 오류가 무엇인지 알 수 있습니다.

그러나 여러 예외가있는 void 함수 대신 OK이면 true를 반환하는 부울 함수가 있고 실패 할 경우 false가됩니다. 실패한 정확한 것을 어떻게 알 수 있습니까?

함수가 여러 가지 이유로 실패 할 수 있으므로 내 프로그램에서는 False를 반환하지 않는 것이 좋습니다. 일부 텍스트가있는 Exception을 반환하면 사용자에게 정확한 오류를 보여줄 수 있습니다.

"올바른"또는 다른 오류와 같은 단어를 반환하는 문자열 기능이 나에게 가장 좋은 것으로 보이지 않습니다. 권장되는 접근 방법은 무엇입니까?

+1

이전 게시물의 의견을 읽고 '프로그램 흐름을 제어하기 위해 예외를 사용하지 마십시오.'라는 조언을 따르십시오.' – MethodMan

+0

@DJKRAZE 나는 이전의 qestion에서 그것을 이해하고 나는 똑같은 것을 요구하지 않는다. 이제 다른 (관련) 문제를 어떻게 해결해야하는지에 대한 질문을하고 있습니다. André Snede Hanse가 다른 질문에서 제안한 것과 같은 새로운 질문으로 그것을하고 있습니다. –

+1

bool 대신 enum을 반환 할 수 있습니다. 더 많은 정보가 필요하다면 열거 형 대신 클래스 객체를 반환 할 수 있습니다. 그러한 클래스는 Exception 객체를 닮기 시작할 것 같다. 따라서 예외를 반환하는 것이 실제로 잘못된 것은 아닙니다. 무엇이 잘못되었는지는 발신자가 무시할 수있는 기회를 열어주는 것이지 결코 끝나지 않는 것입니다. 예외 처리가 느리다고 결코 걱정하지 않으셔도됩니다. 프로그램이 수행해야 할 일을하지 않으려면 50 마이크로 초가 걸리지 않아도 상관 없습니다. –

답변

1

추천 방법은 요청한 사람에 따라 크게 달라질 수 있습니다.

우리가 매우 큰 시스템에서 구현 한 방식은 필요에 따라 구조화 된 오류 클래스를 메서드의 매개 변수 중 하나 또는 메서드의 반환으로 포함시키는 것입니다.

이 오류 클래스에는 잘 알려진 오류의 번역, 사용자가 사용할 수있는 메시지를 보관하기위한 메시지 문자열 및 재시도 가능성, 사망률 등을 나타내는 데 사용할 수있는 다양한 플래그를 수행 할 수있는 오류 코드가 포함되어 있습니다.

우리는 애플리케이션 서버에서 모바일 장치 및 웹 서비스 방법에 이르기까지 모든 수준의 애플리케이션에서이 오류 클래스를 사용합니다.

이것은 우리의 접근 방식 일 뿐이며 문제가되지 않지만 다른 구현 방법이 필요합니다.

2

"... 정확히 실패한 것을 어떻게 알 수 있습니까?"

이 질문을하면 메서드에서 너무 많이 진행되고 있으며 리팩터링 할 시간이라는 의미 일 수 있습니다. 기능 1 많이하고있다

void Function1() 
{ 
    //Do something... 
    //If something fail 
    Throw New Exception("Fails because bla bla"); 

    //Do something... 
    //If something fail 
    Throw New Exception("Fails because bla bla bla bla"); 

    //If everything its ok, just continue without throwing anything 
} 

:

는 여기에 귀하의 이전 질문에서 복사 한 예입니다. 유지 관리 (및 테스트)를 쉽게하기 위해 논리 그룹을 개별 메소드로 추출 할 수 있으며, 각 메소드는 성공을 나타 내기 위해 bool 값을 리턴합니다.

bool SomethingOne() 
{ 
    var successful = true; 

    //Do something... 
    //If something fail 
     successful = false; 

    return successful; 
} 

bool SomethingTwo() 
{ 
    var successful = true; 

    //Do something... 
    //If something fail 
     successful = false; 

    return successful; 
} 

void Function1() 
{ 
    var isOneSuccessful = SomethingOne(); 
    if (!isOneSuccessful) 
    { 
     // SomethingOne failed - do something 
     return; 
    } 

    var isTwoSuccessful = SomethingTwo(); 
    if (!isTwoSuccessful) 
    { 
     // SomethingTwo failed - do something 
     return; 
    } 

    //If everything its ok, just continue without throwing anything 
} 

YMMV. 나는 "무언가 실패"가 비판적인 문제라고 가정하고 있습니다. 어쩌면 이것이 유효성 검사 루틴 일 수도 있고 "모든 필드를 확인하십시오"라는 메시지 만 표시 할 수도 있습니다.

사용자의 메서드를 사용하는 프로그래머가 특별히 인식하고 처리해야하는 것이거나 사용자가 더 알고 있어야하는 것이면 간단한 부울로 잘라낼 수 없습니다.

관련 문제