2011-04-14 43 views
3

讓我們來看看這個簡單的try/catch例如...的try/catch - 回到原來的嘗試

try 
{ 
    // User inputs path of a file 
    if(!ValidPath) 
     throw new InvalidPathException(); 
} 
catch InvalidPathException e 
{ 
    // Log error 
    // Re-throw the error. 
    throw;  
} 

夫婦的問題。兩者都可能是簡單的答案。

  1. 是否拋出捕獲返回並檢查下一個捕獲,然後下一個,等等?
  2. 有沒有辦法回到原來的嘗試?還是那種糟糕的編程習慣?
+1

你可能是對 '下一步' catch塊是什麼清晰。 – 2011-04-14 15:09:08

回答

2
  1. 是的catch塊中的throw語句將被任何wrapper/next catch塊重新捕獲。

  2. 使用Basic Goto:like語句修改程序流是一種不好的編程習慣,因此建議不要返回到原始代碼塊(這也是不切實際的)。此外,您總是嘗試處理接近它們發生的異常,因爲調試器輸出&堆棧跟蹤將以這種方式提供更多信息。

+0

它C#使用'goto'語句從外部輸入塊(例如'try'塊)實際上是非法的。所以這不僅僅是一個糟糕的編程習慣。 – 2011-04-14 15:19:39

+0

修改代碼流並不是不可能,但非常不切實際,所以是的,你是對的。 – 2011-04-14 15:24:29

+0

呃...你做'while(condition){try {do stuff} catch(){}}',但是你需要小心不要陷入無限循環。不是一個「嘗試抓住重試」,但你可以到達那裏。 – ThatBlairGuy 2011-04-14 16:15:44

1

每個try塊可以有多個捕獲,但只有一個將被使用。它會捕獲最接近的例外。如果你拋出異常,它將完全離開這個try塊,只有周圍的catch才能處理重新拋出的異常。

0

1.Does在catch扔回去檢查下接球,然後下一個,等等?

只會選擇第一個與任何try塊中的例外相匹配的catch塊。如果一個catch塊重新拋出這個異常,那麼它將被傳播到一個外部try/catch塊(如果有的話),或者調用堆棧中的任何其他try/catch塊。 (它不會被同一個try/catch塊中的另一個catch塊捕獲。)

2.是否有回到原始嘗試的方法?還是那種糟糕的編程習慣?

在C#中,您不能返回拋出異常的位置,如果這是您要求的位置。如果你想再一次完成整個try塊,那麼你就把它放在一個循環中。這要求您不要重新拋出異常,因爲這會將執行從方法中移出。

有關重試try塊的示例,請參閱this question的答案。

-1
  1. 是否拋出捕獲返回並檢查下一個捕獲,然後下一個,等等?

    Ans:不,它沒有。只有catch塊。

  2. 有沒有辦法回到原來的嘗試?還是那種糟糕的編程習慣?

    答:是的,很少有不同的策略/黑客。

價1:Try-catch every line of code without individual try-catch blocks

實施例:

public delegate void VoidDelegate(); 

public static class Utils 
{ 
    public static void Try(VoidDelegate v) { 
    try { 
     v(); 
    } 
    catch {} 
    } 
} 

Utils.Try(() => WidgetMaker.SetAlignment(57)); 
Utils.Try(() => arrayname["Title"] = txtTitle.Text); 
Utils.Try(() => objectname.Season(true, false)); 
Utils.Try(() => (Session["CasseroleTracker"]).Seasoned = true); 

另一種方式是使用GOTO statement:

參考文獻2:http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/2294d2ce-e6ae-4152-b022-61aa2ae9372d/

另一種方法是用On Error Resume Next

註釋3:http://msdn.microsoft.com/en-us/library/5hsw66as.aspx

+0

您無法從塊外部的try塊中獲取標籤。錯誤是Visual Basic。 – recursive 2011-04-14 15:31:27

+0

@recursive:你可以從同一個catch獲得一個try塊內的標籤。你不瞭解問題和我的答案,不知道細節。檢查這個實際的手冊:http://msdn.microsoft.com/en-us/library/69whc95c%28v=vs.80%29.aspx – Priyank 2011-04-14 15:39:56

+0

您正在提供一個關於Visual Basic的文檔的鏈接,而不是C#。我真的嘗試過。編譯時錯誤消息是這樣的:在goto語句的範圍內沒有這樣的標籤'asdf'。 – recursive 2011-04-14 17:47:39

-2
var anyway = true; 
while(anyway) 
{ 
try 
{ 
do somthing 
... 
... 
... 
if no errors anyway = false 
} 
catch 
{ 
    somthing wrong! 
} 
} 

;)