Sway 參考手冊/異常
外觀
當直譯器檢測到程式碼中的錯誤時,就會發生異常。這些錯誤可能是語法錯誤或語義錯誤。您之前已經看到過異常的後果:未定義變數異常、除以零異常等等。
當生成異常時,據說它被引發或丟擲。除非捕獲異常,否則它將終止當前函式呼叫的處理,然後向上傳播,終止進行呼叫的函式的處理,等等。
除非異常被捕獲(見下一節),否則如果執行檔案,異常最終將終止 Sway 直譯器。如果 Sway 正在互動式執行,處理將終止到(但不包括)提示讀取評估迴圈(帶有sway>和more>提示)。
可以使用catch函式停止異常的傳播。catch的唯一引數是一個可能生成異常的表示式。catch函式評估其引數,如果未引發異常,則返回評估表示式的值。如果引發了異常,catch將異常轉換為錯誤物件。
以下是 catch 的典型用法
var x = catch(process(a,b));
if (x is :ERROR && x . type == :mathError)
{
x = 0;
}
else if (x is :ERROR)
{
throw(x);
}
...
請注意,如果您捕獲了異常,但事實證明您不想處理它,您可以使用throw函式重新丟擲它。
您可以使用throw函式的不同用法生成自己的異常。這種throw的用法需要兩個引數。這些引數可以是任何東西,但按照慣例,第一個引數是符號,第二個引數是字串,提供有關錯誤的更多解釋。例如,假設您希望在變數應該為偶數但實際上不是的情況下引發異常
if (x % 2 == 1)
{
throw(:oddValue,"x is " + x + ", it should be even.");
}
如果您包含基礎庫,您可以使用'try函式,它簡化了異常的捕獲和處理。以下是之前顯示的典型用法的版本
var error;
...
try (error)
{
x = process(a,b);
}
else if (error . type == :mathError)
{
x = 0;
}
else
{
throw(error);
}
...
try函式要求將一個變數作為第一個引數傳遞;如果發生異常,它將把此變數設定為捕獲的異常。
return函式生成型別為:return的特殊異常,因此表示式
return x + y;
等效於
throw(:return,x + y);
由於返回最終是一個異常,遇到返回將導致立即結束函式體的處理。
但是,此異常會被設定函式呼叫的直譯器部分捕獲,並且不允許進一步傳播。