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