[英]try catch finally in a method
這里會發生什么? 我想知道是否可以在異常塊之后調用SaveError()? Main.cs是否收到有關捕獲的錯誤的通知? 我想看看這個案子背后的故事。 變量“ a”的值是多少? 注意:假設try塊中有錯誤。
主干
public void RunAll()
{
....
int a = doSubTask();
}
A.cs
public int doSubTask(){
try{
..
..
return 1;
}catch(Exception Ex)
{
throw new AppException("Error", ex);
}
finally
{
SaveError();
return -1;
}
return 0;
}
return 0;
finally
是多余的,因為無論緩存是否存在異常,始終都會調用finally
。
無論如何,將finally
塊保留為return
會導致編譯錯誤,這意味着在您的情況下,由於您是在catch
塊內部引發異常,因此將不會設置任何值。
首先,您不能在finally
塊內返回值,C#不允許這樣做。
即使有錯誤, finally
總是執行(即控制進入catch塊)。 因此,在您的情況下,返回值將始終為-1,無論是否引發異常都無關緊要。
最后一條語句return 0;
是無法訪問的。
簡短的答案:這取決於您的計算機^^如您在此MSDN文章中所見: http : //msdn.microsoft.com/en-us/library/zwc8s4fz.aspx ,如果未處理異常,則取決於您的系統決定是否執行Final語句。
另外:您不能在finally
語句中返回值。
Foo
的整個方法對我來說似乎有些混亂。 如果您的目標是嘗試“危險”操作並處理錯誤,那么在沒有外部代碼處理該異常的情況下,您不應拋出異常。
因此,如果您希望RunAll
方法知道是否有錯誤,則應在try
- catch
語句中設置其代碼,然后將Foo
方法中的異常重新拋出,而無需使用finally
語句,以便重新拋出的異常“使鏈條破裂”並在調用方法中處理:)
我想您可以像這樣修改您的代碼。 在一種方法中,您不應使用多個“返回”鍵。
public int doSubTask()
{
int retval = 0;
try
{
//to do
retval = 1;
}
catch (Exception Ex)
{
SaveError();
retval = -1;
throw new AppException("Error", ex);
}
finally
{
// do something even there is error or not
}
return retval;
}
不允許嘗試“離開” finally
塊,因此說return -1;
無效return -1;
在finally
塊中。 因此,您的代碼將永遠無法編譯。
錯誤CS0157:控件無法離開finally子句的主體
因此,不存在“運行時會發生什么”的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.