簡體   English   中英

最后嘗試用一種方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM