2017-12-22 40 views
1
private void ProcessData(IProcessor processor) 
{  
    Data data = new Data(); 

    try 
    { 
     processor.Process(data); 
    } 
    catch(Exception e) 
    { 
     CustomCode(e); 
    } 
} 

콘크리트 IProcessor processor.Process 메소드 구현 :잡기 예외를 여러 번 - C#

public void Process(Data data) 
{ 
    try 
    { 
     Thing a = null; 
     a.MakeSomething(); 
    } 
    catch(NullPointerException e) 
    { 
     DoSomething(); 
    } 
} 

내가 모든 (ProcessData() 방법 또는 "시도"블록 모두 나오는 모든 예외에 대한 CustomCode() 방법을 실행하고 싶습니다 호출 스택의 코드 ProcessData()에서 예외를 throw하는 스택 끝까지 여러 예외 처리기에서 처리해야합니다.이 예제에서는 DoSomething()CustomCode()을 실행해야합니다. 어떻게해야합니까? 나는 "던지기"를 더할 수 있다는 것을 안다. "DoSomething();"이후이지만 프로세서의 모든 구현에서 모든 프로그래머는 항상 "throw;"라고 쓰는 것을 기억해야합니다. 캐치 (...)에 을 입력하면 CustomCode(e)이 실행될 수 있습니다. 어떻게 든 더 잘할 수 있습니까?

+0

예외 상황에 관계없이 항상 customerCode가 발생하게하려면 설계상의 결함이 있습니다. try()에서 try catch를 제거하고 processdata()가 처리하도록하십시오. 예외가 처리 된 경우 처리 할 대상을 선택해야합니다. – Seabizkit

+1

당신은 * NullReferenceException을 잡아서는 안됩니다. (NPE는 자바입니다. 아니면 당신 자신의 예외 클래스를 가지고 있습니까?) * 피하십시오 *. 따라서 예외를 전혀 신경 쓰지 않아도됩니다. – HimBromBeere

+0

Seabizkit 다른 IProcessor 구현이 있습니다. 그 중 하나에서 데이터베이스 트랜잭션을 커밋합니다. 이 트랜잭션을 커밋 한 후에 예외가 발생하면이 트랜잭션을 롤백하고 싶습니다. 각 IProcessor 구현에는 Process (Data 데이터)가 수행중인 작업에 따라 다른 예외 처리 코드가 있어야합니다. – Zygmuntix

답변

1

, 당신은 그것이이다 숨기는 Process의 catch 블록의 끝에서 예외 Process 구현 또는 적어도 throw; 시도 - 캐치를 갖고 싶어하지 않을 수 있습니다 나쁜 습관.

그렇지 않으면,이 솔루션은 뭔가 잘못하고 CustomCode() 실행해야한다는 것을 의미 데이터 처리 (예를 들어 특별한 플래그가 설정)와 그렇지 않은 경우는 확인 ProcessData()에서 finally 블록을 가질 수 있습니다, 그런데 어떤 종류의 예외인지는 알 수 없습니다. 다음과 같은 것 :

+0

나는 finally 블록을 가진 해결책이 맞다는 것에 동의한다 :) – Zygmuntix

1
public void Process(Data data) 
{ 
    try 
    { 
    Thing a = null; 
    a.MakeSomething(); 
    } 
    catch(NullPointerException e) 
    { 
    CustomCode(); 
    DoSomething(); 
    } 
    catch(Exception ex) 
    { 
    CustomCode(); 
} 

은}

내가 @Seabizkit의 의견에 동의
+0

Processor 클래스의 구현이 많기 때문에 ProcessData 메서드 수준에서 예외 처리를 구현하려고합니다. 나는 당신을 혼란스럽게하지 않기 위해 문제의 코드를 수정할 것입니다. – Zygmuntix