簡體   English   中英

try-catch共享相同的作用域塊嗎?

[英]Does try-catch share the same scoping block?

我有一個try-catch序列。

try 
{
    int tryCatchVar = 0
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

我在try塊中聲明並分配了一個變量。 通常,變量的作用域是在其內聲明的塊以及嵌套在其中的所有塊。 但是,由於try-catch具有很強的關系性,我想知道try中聲明的變量是否在catch的范圍內?

如果沒有,那么我想做以下事情:

int tryCatchVar

try
{
    tryCatchVar = 0
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

那行得通嗎?


推理:

我有兩個參數可能會引發異常。 但是,由於我的應用程序的局限性(這時是不可變的),我只能將用戶錯誤消息記錄到一個特定的字符串中。 我正在考慮實現兩個try-catch序列。 如果兩者均跳閘,則它們將生成存儲在tryCatch中的內部日志。 然后,根據tryCatch的值,我將生成一條新的錯誤消息。

但是,由於try-catch具有很強的關系性,我想知道try中聲明的變量是否在catch的范圍內?

您可以自己輕松測試,但答案是否定的。

(第二部分)

那行得通嗎?

同樣,您可以自己輕松地進行測試,但答案是否定的-因為不會明確分配它。 您可以通過以下方式輕松修復它:

int tryCatchVar = 0;

try
{
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

(當然,我強烈建議您不要以這種方式捕獲所有異常。使用有針對性的捕獲塊,很少丟棄而不記錄異常的好方法很少。)

一般的經驗法則是大括號定義范圍。 因此,無論您要查看的是什么代碼,無論您處理的是哪種類型的語句,以下內容始終都是正確的:

{
    int x;
}
{
    // x is now out of scope
}

但是,即使新的塊已經開始,變量也將在作用域內,並且塊尚未結束,因此以下情況說明了變量仍在作用域內:

{
    int x;
    {
        //x is still in scope
    }
}

范圍是不同的。 您必須使用如下代碼:

int tryCatchVar = 0; // or some other value

try
{
    tryCatchVar = 1;
    ...other code...
}
catch
{
    if (tryCatchVar != 0) return;
}

簡而言之,原因是try中的任何內容可能會在catch之前實際運行,也可能不會實際運行,這取決於是否以及何時引發異常,因此編譯器無法假定實際發生了任何事情。

沒有; catch不在try的范圍內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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