문제

내가 붙어 결정하는 예외를 처리하는 방법에 내 응용 프로그램이 있습니다.

많은 경우 문제를 예외에서 오 1)데이터 액세스를 통해 원격 서비스 또는 2)나열 JSON 개체입니다.불행하게도 나는 할 수 없이 성공을 보장해에 대한 하나의 이러한 작업(커트 네트워크 연결,잘못된 JSON 는 개체의 제어).

결과적으로 할 경우가 발생하는 예외가 나는 단순히 그것을 잡을 함수 안에서 FALSE 를 반환하여 발신번호를 입력하실 수 있습니다.나의 논리로 모든 발신자가 정말 걱정이 태스크가 정상적으로 완료되었지 왜 성공하지 못했습니다.

여기에 몇 가지 예제 코드(JAVA)전형적인 방법)

public boolean doSomething(Object p_somthingToDoOn)
{
    boolean result = false;

    try{
        // if dirty object then clean
        doactualStuffOnObject(p_jsonObject);

        //assume success (no exception thrown)
        result = true;
    }
    catch(Exception Ex)
    {
        //don't care about exceptions
        Ex.printStackTrace();
    }
    return result;
}

내 생각에 이러한 접근은 괜찮지만,정말 호기심이 무엇을 알고 최고의 관행은 관리를 위한 예외한다(정말 거품 예외의 모든 방법을 호출 스택?).

요약에서의 주요 질문:

  1. 그것은 두려워하지 말아야 잡아 예외는 아니지만 거품이 그들을 또는 공식적으로 알리 시스템(중 하나를 통해 로그인 또는 사용자에게 알림)?
  2. 무엇 최고의 관행은 거기에 대한 예외지 않은 결과에서 필요로 하는 모든 것을 시도/catch block?

따라/편집

모든 의견을 보내 주셔서 감사합니다,발견한 우수한 소스에는 예외 관리 온라인:

그것은 보인다는 예외 관리는 것들 중 하나에 따라 달라지는 상황.하지만 가장 중요한 것은,하나의 일치해야에서 그들은 어떻게 예외를 관리 시스템 내에서.

또한계 코드-부패을 통해 과도하려고/또는 포기하지 않는 예외를 존중(예외는 경고 시스템,다른 무엇이 필요하다고 경고했?).

또한,이것은 선택의 댓글 m3rLinEz.

나도 동의하는 경향이있으로 Anders Hejlsberg 고 너는 대부분의 발신자만 경 작업이 성공하지 않습니다.

에서 이 코멘트를 제공 몇 가지 질문에 대해 생각하는 경우 예외 처리:

  • 점은 무엇이 예외가 발생되는?
  • 어떻게 그것이 의미를 처리하나요?
  • 가 호출자는 정말로 걱정하는 예외 또는 그들은 단지 배려는 경우 호출이 성공했?
  • 은 강제 적용자를 관리하는 잠재적인 우아한 예외?
  • 당신은 당신을 존중하 idoms 의 언어?
    • 당신은 정말을 반환해야 하는 성공을 깃발처럼 boolean?반 boolean(또는 int)의 더 C 사고 방식보다는 자바(Java 에서 당신은 단지 처리 제외)중 하나입니다.
    • 따라 오류는 관리 구조와 관련된 언어:)!
도움이 되었습니까?

해결책

그것은 나에게 이상한 것 같다는 것을 잡고 싶으신 예외 및 그들을 차례 오류 코드가 있습니다.왜 당신은 당신이 생각하자는 것을 선호 오류 코드를 통해 예외가 후자는 기본 모두에서 Java,C#?

로 당신의 질문:

  1. 당신이해야만 예외를 포착할 수 있는 실제로 처리합니다.그 길을 끄는 예외가되지 않은 옳은 일이 대부분의 경우에 있습니다.몇 가지 예외가 있다(예를들면로깅 및 예외를 정렬 사이 스레드)그러나 심지어 사람들을 위해 경우에 당신은 일반적으로 를 다시 발생시키고,예외가 있습니다.
  2. 당신은 확실히 없이 많은 시도/catch 문의 코드입니다.다시 생각하는 것입을 잡는 예외 처리할 수 있습니다.을 포함할 수 있는 최상의 예외 처리기 차례로 처리되지 않은 모든 예외로 뭔가 다소에 대한 유용한 최종 사용자만 그렇지 않으면 당신은하지 않아야를 잡으려고 각각의 예외 가능한 모든 장소입니다.

다른 팁

이에 따라 달라집 응용 프로그램과 상황이다.는 경우에 귀하의 건물 라이브러리 구성요소는,당신은 거품까지 예외가 있지만 싸여 있어야 될 상황과 구성 요소입니다.예를 들어 귀하의 건물에는 Xml 데이터베이스에 그리고 당신이 사용하는 파일 시스템을 데이터를 저장하고,당신은 당신을 사용하여 파일시스템 권한을 보안하는 데이터입니다.고 싶지 않을 거대 FileIOAccessDenied 예외로는 누출의 구현합니다.대신 당신 랩을 제외하고 AccessDenied 오류가 있습니다.이 경우 특히 사실 당신은 배의 구성 요소를 제삼자에게 있습니다.

으로 대한다면 그것도 괜찮을 삼키는 예외가 있습니다.는 시스템에 따라 달라 집니다.하는 경우 응용 프로그램을 처리할 수 있 실패사례가 없에서 혜택을 알리는 사용자가 실패한 이유 다음 가,나는 추천하는 로그에 오류입니다.나는 항상 그것을 발견 새로운 속편 모험에 반환하기 위해 호출되는 문제를 해결하는 데 도움이 됩 문제를 찾은 그들을 삼키는 제외(또는 대체를 던지고 새로운 중 하나가 대신 설정하지 않고 내부 예외).

일반적으로 다음과 같은 규칙을 사용:

  1. 내 구성 요소 및 라이브러리는 나만을 잡을 경우 예외가 나는 그것을 처리하거나 뭔가에 기초합니다.나고 싶은 경우에 추가로 상황 정보는 예외는 아니다.
  2. 내가 사용하는 일반적인 시도에 잡 응용 프로그램 엔트리 포인트 또는 최고 수준이 가능합니다.는 경우에는 예외가 여기에 나는 단지 그것을 기록하고 그것이 실패합니다.이 예외는 없습니다.

내가 찾는 다음과 같은 코드를 냄새:

try
{
    //do something
}
catch(Exception)
{
   throw;
}

이와 같은 코드를 제공합 없는 지점이 포함되지 않아야 합니다.

추천하고 싶은 것이 다 좋은 소스에서 주제입니다.그와의 인터뷰는 발명자의 C#,Java 와 Anders Hejlsberg 및 제임스 빈센 각각의 주제에 자바의 확인 예외는 아니다.

실패 및 예외

도 있 훌륭한 자원의 맨 아래에서 페이지입니다.

나도 동의하는 경향이있으로 Anders Hejlsberg 고 당신은 가만 호출자에게 관리하는 경우 작업이 성공하지 않습니다.

빌 Venners:당신이 언급한 확장성 및 버전 문제 와 존중을 확인 예외가 있습니다.할 수 있을 명확히 무엇을 의미 그 두 가지 문제가 있습니까?

Anders Hejlsberg:시작하자 버전 관리기 때문에,문제의 아주 쉽게 볼 수 없다.겠. 을 만들는 방법 foo 선언 발생한 예외 A,B,C에 버전은 두 가지의 foo 를 추가하고 싶 무리의 특징,그리고 지금 foo 도 예외가 발생 D.그것은 깨 변경 내 D 을 던졌 절하는 방법이기 때문에, 기존자의하는 방법 거의 확실하게 처리하지 않는 예외는 아니다.

를 추가하는 새로 예외를 발생 절에 새로운 버전을 나누기 클라이언트 코드입니다.그것은 같은 추가하는 방법을 인터페이스입니다.후에 게시할 인터페이스,그것은 모든 실용적인 목적 변경할 수 없기 때문에,어떤 그것의 구현할 수 있가 는 방법에 추가하고자하는 다음 버전입니다.그래서 당신은 당신을 만들기 새로운 인터페이스를 대신 합니다.마찬가지로 와 예외를 제외하고,당신은 것 중 하나이 을 만들기 전 이라는 새로운 방법 foo2 을 던져 더 많은 예외 또는 당신이 잡을 제외 D 새로운 foo,변환 D 로 A,B,C.

빌 Venners:하지만 당신은 파괴 그들의 코드에서는 어쨌든,도 언어 없이 확인 예외?는 경우 새로운 버전의 foo 을 던져 새로운는 예외 클라이언트에 대해 생각해야 처리 지 않다 그들의 코드에 의해 깨진 사실 그들은 기대하지 않는 는 경우는 예외들이 썼다고 합니까?

Anders Hejlsberg:이 없기 때문에 많이 의 경우,사람들은 걱정하지 않는다.그 하지 않을 핸들러 예외가 있습니다.거래 수준 예외 처리기의 주위에 그들의 메시지 루프입니다.는 핸들러가 을 대화는 무엇을 말한다 갔 잘못하고 계속합니다.프로그래머 보호 코드를 작성하여 해보 마지막으로 모든 곳,그래서 그들은 다시 정확하게 예외가 발생하는 경우, 하지만 그들은 실제로에 관심이 을 처리하는 예외가 있습니다.

던짐 절에서 이상 방법 그것의 구현 Java,지 반드시 당신을 처리 예외가 있지만,없는 경우 처리 들,그것은 당신을 인정 정확하게는 예외를 통과 할 수 있습니다 니다.그것은 당신이 중 catch 선언한 예외들 또는 그들을 넣어 에서 자신의 발생한다.일 이 요구 사항,사람들 말 것이다.예를 들어, 장식한 모든 방법으로,"throw 예외는 아니다." 는 그냥 완전히 패배기능,그리고 당신은품 프로그래머 더 쓰 gobbledy 화장품.는 도움이 되지 않아도 됩니다.

편집:자세한 내용을 추가에 converstaion

확인된 예외 사항은 논란이 문제를 일반적으로 자바(특히 나중에 나를 찾으려고 몇 가지 예는 사람들을 위해 찬성과 반대하여 그들).

으로 엄지손가락의 규칙,예외 처리해야 주위에 무언가 이러한 지침을 특별한 순서없:

  • 의 이익을 위해 유지 관리,항상 로그인 예외도록 시작하면 버그 보고,로그에 도움이 될 것입니다 당신을 가리키는 장소의 버그가 가능성이 시작됩니다.를 떠나지 printStackTrace() 나 좋아하는 것,그것의 기회의 하나의 사용자 중 하나를 얻을 것이 그들의 스택 추적 결국,고 정확히 제로 지식 무엇으로 그것으로 할 수 있습니다.
  • Catch 예외 처리할 수 있는 유일한 사람, 고 그들을 처리,를 던지지 말라 그들을 합니다.
  • 항상 특정 예외 클래스 일반적으로 유지해야 합 catch 유형 Exception, 에,당신은 가능성이 매우 높 삼 그렇지 않으면 중요한 예외가 있습니다.
  • 지(적)캐치 Errors!!, 을 의미: 잡을 수 없 ThrowablesErrors 은 서브 클래스의 후자입니다. Errors 은 문제가 당신을 가능성이 높지 않을 처리할 수 있(예: OutOfMemory, 또는 다른 JVM 문제)

에 관한 특정한 경우,는지 확인하십시오 클라이언트를 호출하는 방법을 받을 것이 적절 반환 값.실패하면,boolean-반환 방법을 반환할 수 있는 거짓,그러나 확인한 장소를 호출하는 방법을 처리할 수 있다.

당신만을 잡는 예외 처리할 수 있습니다.는 경우,예를 들어,당신과 함께 다루고 있어 읽기를 통해 네트워크와 연결 시간을 얻을하는 예외에 다시 시도할 수 있습니다.그러나 만약 당신이 읽고 네트워크를 통해 얻을 IndexOutOfBounds 예외에,당신은 정말 처리할 수 없는 하지 않기 때문에(물론,이 경우에 당신은 늘)그것을 원인이 무엇인지 알고있다.하려면 false 를 반환 또는 -1 또는 null,확인을 위해 특정 예외가 있습니다.나는 원하지 않는 라이브러리를 반환하는 거짓는 네트워크에서 읽을 때에 예외가 발생했는 힙 메모리가 부족합니다.

예외는 오류되지 않은 부분의 일반적인 프로그램 실행이 가능합니다.에 따라 귀하의 프로그램을 수행하고 그 사용하는(i.e워드 프로세서 대심장 모니터에)당신이 원하는 다른 일을 할 수가 발생할 경우는 예외입니다.나가 코드를 사용하는 예외의 일부분으로 정상적인 실행하고 그것은 확실히 코드 냄새가 있다.

Ex.

try
{
   sendMessage();

   if(message == success)
   {
       doStuff();
   }
   else if(message == failed)
   {
       throw;
   }
}
catch(Exception)
{
    logAndRecover();
}

이 코드는 나에게 barf.IMO 당신이하지 않아야 복구에서는 예외지 않는 한 그것의 중요한 프로그램입니다.하는 경우 예외가 발생한 다음 나쁜 일이 일어나고 있다.

위의 모든 것,합리적이고 종종 직장할 수 있는 정책이 있습니다.우리의 장소에 우리가 정의된 형식의 예외: SystemException (선택)및 ApplicationException (선택).

우리가 합의 SystemExceptions 는 가능성을 회복시킬 수 있 bve 처리하면 상단에 있습니다.에 제공한 개인 컨텍스트,리 SystemExceptions exteneded 을 나타내는 그들이 발생하,예를 들어, RepositoryException, ServiceEception, 니다,등등.

ApplicationExceptions 할 수 있는 비즈니스 의 InsufficientFundsException 고 처리해야 합니다 클라이언트 코드입니다.

Witohut 구체적인 예를 들어,그것은 어렵에 구현,하지만 나는 사용하지 않을 것이라는 반환 코드,그들은 유지 관리 문제입니다.수도 있습 삼는 예외는 아니다,하지만 당신이 결정이 필요한 이유,그리고 항상 로그 이벤트 stacktrace.마지막으로,당신의 방법 없는 다른 처리 매우 중복(제외한 캡슐화?), 그래서 doactualStuffOnObject(p_jsonObject); 반환할 수 있는 부울!

후 일부 생각과를 보고 코드 그것은 나에게 보인다는 당신은 단순히 rethrowing 예외로 boolean.당신이 있었는 방법 통과 이 예외를 통해(당신은 심지어 그것을 잡으려고)하고 그것을 다루에서 호출자가 때문에,그 장소는 그것이 문제입니다.는 경우에는 예외는 원인이 될 것이 다시 시도 하려면 호출자는 이 함수 호출해야 한길을 끄는 예외입니다.

이것은 때때 발생하는 예외를 발생되지 않습니다 것을 발신자(즉그것은 네트워크 제외)하는 경우에 당신은 당신 랩 그것은 도메인에서 특정 예외는 아니다.

는 경우에 다른 한편으로는,예외 신호를 회복할 수 없는 오류에 당신의 프로그램(즉최종 결과는 예외의 것 프로그램을 종료)나 개인적으로 좋아하는 명시적으로 끄는 그것을 던지는 런타임 예외가 발생합니다.

당신은 코드를 사용 패턴의 예,전화 TryDoSomething 및 특정 예외가 있습니다.

를 사용하는 것이 좋 예외가 필터 로그인할 때에 예외 진단을 위한 목적입니다.VB 가 언어로 지원한 예외의 필터입니다.에 대한 링크를 Greggm 의 블로그가 구현에서 사용할 수 있는 C#.예외의 필터가 더 나은 속성에 대한 debuggability 이상 잡아 다시 발생시킬.특히 기록할 수 있습 문제에서는 필터와 예외를 계속됩니다.는 방법이 허용하는 연결 JIT(Just in Time)디버거가 전체 스택입니다.이를 다시 발생시키고 인 스택에서 점점 다시 throw.

의 경우 TryXXXX 의미가 있다면 당신이 감싸는 타사의 기능을 던지는 경우에는 정말 특별하거나,간단한 어렵지 않고 테스트를 호출하는 기능입니다.예를 들어 다음과 같습니다.

// throws NumberNotHexidecimalException
int ParseHexidecimal(string numberToParse); 

bool TryParseHexidecimal(string numberToParse, out int parsedInt)
{
     try
     {
         parsedInt = ParseHexidecimal(numberToParse);
         return true;
     }
     catch(NumberNotHexidecimalException ex)
     {
         parsedInt = 0;
         return false;
     }
     catch(Exception ex)
     {
         // Implement the error policy for unexpected exceptions:
         // log a callstack, assert if a debugger is attached etc.
         LogRetailAssert(ex);
         // rethrow the exception
         // The downside is that a JIT debugger will have the next
         // line as the place that threw the exception, rather than
         // the original location further down the stack.
         throw;
         // A better practice is to use an exception filter here.
         // see the link to Exception Filter Inject above
         // http://code.msdn.microsoft.com/ExceptionFilterInjct
     }
}

당신 같은 패턴을 사용 TryXXX 또는지의 스타일은 질문입니다.의 질문을 끄는 모든 예외 및 그들을 삼키지 스타일에 문제가있을 수 있습니다.는지 확인 예기치 않은 예외가 허용되는 전파!

나는 당신의 단서에서 표준 라이브러리에 대 한인 언어를 사용합니다.내가 말할 수 없 C#지만,살펴보겠 Java.

예를 들어 java.랭.반영합니다.배열은 정적 set 방법:

static void set(Object array, int index, Object value);

C 방법이 될 것이다

static int set(Object array, int index, Object value);

...과 함께 반환하는 값에는 성공을 표시.하지만 당신은 C 세계니다.

면을 받아들이 예외를 제외하고,당신은 것을 발견 그것은 당신의 코드 간단하고 명확하게 이동하여,당신의 오류 처리 코드에서 핵심 논리입니다.하는 것을 목표로하고 있 많은 문 single try 니다.

으로 다른 사람들이 주목해야 합 가능한 구체적으로의 종류에 예외는 당신이 잡을 수 있습니다.

려고하는 경우에 당신을 잡을 제외하고는 false 를 반환해야한다,아주 특정한 예외는 아니다.당신이 하지 않는,당신을 잡는 그들 모두 돌아와 거짓입니다.를 받은 경우는 MyCarIsOnFireException 나는 그것에 대해 알고 싶다!의 나머지는 예외로 나가지 않을 수도 있습니다그래서 당신이 있어야의 스택은 예외 처리기는 것이 말하는"워 워 뭔가 잘못된 여기서"대한 몇 가지 예외가(를 다시 발생시키거나,잡아 다시 발생시킬 새로 예외를 설명하는 더 잘 일어난 것)및 그냥 false 를 반환에 대한 다른 사람입니다.

이는 제품이 될 것을 실행해야 합 로깅을 그 예외가 어딘가에,그것은 당신을 도울 것입니다 조정 미래에 물건.

편집:질문으로 포장의 모든 것을 하려고/잡을 생각합니다.예외가 있어야 그렇게 희귀 코드에서는 코드에서 실행하는 그렇게 하지 않는 성능을 맞았다.예외를 국가의 국기를 끊었지 무엇을 알 수 있습니다.적어도를 다시 발생시키는 예외 설명서 무슨 일이 일어나고 있는지 그리고 시간은 예외가 발생됩니다."예외에서 방법 doSomeStuff()"매우 도움이 되지 않습니하는 사람을 위해 그림 밖으로 그것이 왜 파산하는 동안 당신은 휴가에서(또는 새로운 작업이).

내 전략:

는 경우 본래의 기능을 반환 void 나는 그것을 변경하는 돌아 bool.는 경우 예외가 발생했을 돌아 false, 는 경우,모든 것을 잘 돌아 true.

만약 기능이 반환해야 합니다 무언가가 다음 경우 예외가 발생한 반환 null, 그렇지 않으면 반환 항목입니다.

bool a 문자열 반환할 수 있는 설명을 포함하는 오류가 있습니다.

모든 경우에 반환하기 전에 아무것도 로그에 오류가 있습니다.

몇 가지 훌륭한 답변을 여기에.추가하고 싶다면 당신은 결국 같은 뭔가를 게시,에서 이상 인쇄보다 스택을 추적합니다.무슨 말을 하시고,Ex.getMessage()을 제공하기 위해,개발자 싸우는 기회가있다.

try/catch 블록 형태의 논리를 포함해 먼저(주)설정으로,이러한 그들은 훌륭한 방법으로 파운드 밖으로 읽을 수 없고,하드 디버깅 스파게티 코드입니다.

여전히 사용되는 합리적으로 그들은 놀라운 일을에서의 가독성,하지만 당신은 그냥 따라 두 가지 간단한 규칙:

  • 그들을 사용하는(제한적)에서는 낮은 수준을 잡을 라이브러리 취급 문제,스트림으로 주요 논리적 흐름입니다.대부분의 오류 처리 우리가 원해야에서 나오는 코드 자체의 일환으로,데이터 자체.왜 특별한 조건에,경우의 데이터를 반환하지 않은 특별한가요?

  • 사용 중 큰 처리기에서 더 높은 수준을 관리하는 어떤 또는 모든 이상한 조건에서 발생하는 코드가 없는 잡았에서 낮은 수준입니다.내용과 오류를(로그를 다시 시작,복구,etc.).

이 두 가지 이외의 다른 형태의 오류 처리,모든 코드의 나머지 부분에서 중세 무료 이어야 한다고 명확한 시도/catch 코드와 오류 개체입니다.는 방법으로,그것은 작품이 단순히 그리고 예상대로 상관없이 당신이 그것을 사용하거나,당신이 무엇을 가진다.

바울은 말합니다.

수도 조금 늦게 대답하지만 오류 처리하는 뭔가가 우리는 항상 변경할 수 있습과 진화를 따라 시간입니다.당신이 무언가를 읽고 싶다면 더 많은 이 주제에 관하여 내가 쓴 게시물을 내 새로 블로그다. http://taoofdevelopment.wordpress.com

행복합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top