2011-12-20 50 views
0

我有以下代码:如何从函数内检查异常的类型?

 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

可以使用is关键字这样

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

您也可以使用switch语句和测试e的类型,但IMO is更容易,更好

+1

我会同意'是'是问题情况最简单的方法。如果他们很多,交换机会更好。 – 2011-12-20 05:27:42

1

可以使用typeOf(e)e.GetType(),然后做一个开关或如果说明。

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。 – 2011-12-20 04:43:59

+0

@CodyGray:因为OP想要一个中央异常处理程序。如果你有50个方法都需要以同样的方式处理一个SqlException,那么发送所有异常到一个中央异常处理程序比拥有50个离散的catch/catch代码集要容易和可靠。 – 2011-12-20 05:53:14