2011-12-20 3 views
0

다음 코드 한 I :함수 내에서 예외 유형을 어떻게 확인할 수 있습니까?

 catch (ServiceException e) { se(e); return View("CreateEdit", vm); } 
     catch (Exception e) { ex(e); return View("CreateEdit", vm); } 
     return RedirectToAction("ShowSummary", new { 
        ds = vm.Meta.DataSourceID 
     }); 

    protected void se(ServiceException e) { 
     ModelState.Merge(e.Errors); 
    } 
    protected void ex(Exception e) { 
     Trace.Write(e); 
     ModelState.AddModelError("", "Database access error: " + e.Message); 
    } 

내가 같은이를 변경하려면 :

 catch (Exception e) { processException(e); return View("CreateEdit", vm); } 

내가 일] ProcessException 기능에 코드를 추가 할 수있는 방법은 그 수있을 것입니다 어떤 종류의 예외인지 확인한 다음 ServiceException 인 경우 인지 아니면 일반적인 예외인지에 따라 조치를 취하시겠습니까? 난 그냥 내 모든 예외 처리를 한 장소에 넣고 싶습니다 다음 전화.

답변

4

당신은

+1

나는 'is'가 문제 상황에 대해 가장 쉬운 방법이라는 데 동의합니다. 스위치가 많으면 스위치가 더 좋을 것입니다. –

1

당신은 사용할 수 있습니다 또한 switch 문을 사용하여이

protected void processException(Exception e) { 
    if (e is XXXException) 
    { 
     this.doThis(); 
    } 
    else if (e is YYYException) 
    { 
     this.doThat(); 
    } 
} 

처럼 is 키워드를 사용하고 e의 유형을 테스트하지만, IMO is 쉽고 더 할 수있는 typeOf(e) 또는 e.GetType() 그리고 switch 또는 if 문을 실행하십시오.

1

은 물론, 우리는 데이터베이스 예외 처리에 광범위하게 사용합니다.

public void processException(Exception ex) 
{ 
    if (ex is System.Threading.ThreadAbortException) 
    { 
     // Do something 
    } 
    else if (ex is AnotherException) 
    { 
     // Do something else 
    } 
} 
+0

그리고 ... 왜 적절하게 파생 된 예외 유형을 잡을 수 없을까요? 그렇다면 어떤 유형인지 알 수 있습니다. 어쨌든'System.Exception'을 잡아 내지 말아야합니다. –

+0

@CodyGray : OP가 중앙 예외 처리기를 원했기 때문입니다. 동일한 방식으로 SqlException을 처리해야하는 50 가지 메서드가있는 경우 50 개의 개별 catch/catch 코드 집합을 갖는 것보다 모든 예외를 중앙 예외 처리기로 보내는 것이 훨씬 쉽고 확실합니다. –

관련 문제