2011-12-20 49 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