2009-12-15 74 views
1

有沒有人知道是否可以將下面的catch語句塊中的代碼作爲單個語句來編寫代碼?我一直無法想出辦法,只是好奇有沒有辦法。c# - 將catch語句塊中的2條語句合併成一個語句

重要提示:必須保留堆棧跟蹤。

catch (Exception e) 
    { 
     if (e is MyCustomException) 
     { 
      // throw original exception 
      throw; 
     } 

     // create custom exception 
     MyCustomException e2 = 
      new MyCustomException(
       "An error occurred performing the calculation.", e); 
     throw e2; 
    } 
+1

我認爲這與你將要得到的一樣好。你可以首先捕獲MyCustomException,並且只包含一個throw。這也許更標準,但仍然需要兩個「邏輯塊」 – 2009-12-15 16:12:47

+4

是否有一個原因,你不想捕捉,然後在一個單獨的catch中拋出更具體的異常(MyCustomException)?例如:catch(MyCustomException){throw} catch(Exception e){...} – Dexter 2009-12-15 16:17:35

+0

@Dexter - 原因是因爲異常可能已經是MyCustomException。如果是這樣,那麼我不想在另一個MyCustomException中重新包裝它,我只想重新拋出它,但確保保留堆棧跟蹤。 – dcp 2009-12-15 16:19:56

回答

15

什麼:

catch (MyCustomException) 
{ 
    throw; 
} 
catch (Exception ex) 
{ 
    throw new MyCustomException(ex); 
} 
+0

是的,這將起作用,但它仍然是2條語句(只是跨越不同的catch塊)。 – dcp 2009-12-15 16:29:29

+0

這不是乞討的問題嗎? – 2009-12-15 16:36:10

+4

但是,它看起來比其他人好得多。代碼長度不是你應該注意的唯一事情。 – Matthias 2009-12-15 16:36:16

2
catch (Exception e) 
{ 
    if (e is MyCustomException) throw; 

    throw new MyCustomException("An error occurred performing the calculation.", e); 
} 

我認爲這是我們所簡潔,因爲它得到的,我想。

這立即引發MyCustomException的堆棧(這是你與throw;在你的問題完成的事情),而投擲MyCustomException包裹在執行中遇到其他類型Exception

或者,你可以這樣做:

catch (Exception e) 
{ 
    throw new MyCustomException("An error occurred performing the calculation.", e); 
} 

,並在MyCustomException被抓的情況下,你將有一個MyCustomExceptione.InnerException哪裏是e一個在堆棧或你的一個新的水平MyCustomException」在MyCustomException不是被捕的情況下,將有System.Exception

+0

我錯了還是扔新會重置堆棧? – 2009-12-15 16:13:14

+0

'扔e;'會重置堆棧。 – antik 2009-12-15 16:13:43

+1

不,如果Exception已經是MyCustomException,那麼您將雙重包裝它,所以最終會出現帶有MyCustomException內部異常的MyCustomException。 – dcp 2009-12-15 16:14:57

0

這實際上是可能的。

然而,堆棧跟蹤將包含其他條目:

public static class ExceptionHelper 
{ 
    public static void Wrap<TException>(Action action, Func<Exception, TException> exceptionCallback) 
     where TException : Exception 
    { 
     try 
     { 
      action(); 
     } 
     catch (TException) 
     { 
      throw; 
     } 
     catch (Exception ex) 
     { 
      throw exceptionCallback(ex); 
     } 
    } 
} 
//Usage: 
ExceptionHelper.Wrap(() => this.Foo(), inner => new MyCustomException("Message", inner)); 
0

將這項工作?

 catch (Exception e) 
     { 
      throw e.GetType() == typeof(MyCustomException) ? e : new MyCustomException("An error occurred performing the calculation.", e); 
     } 
+0

'拋e'不等於'扔' – Blorgbeard 2009-12-15 17:32:17

+0

好點!我不知道這是否可以用一行代碼完成,儘管我不知道爲什麼會這麼做,除非它是一個學術問題而不是實際要求。 – TabbyCool 2009-12-16 10:20:04