跳轉到內容

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);

由於返回最終是一個異常,遇到返回將導致立即結束函式體的處理。

但是,此異常會被設定函式呼叫的直譯器部分捕獲,並且不允許進一步傳播。


繼承 · 惰性求值

華夏公益教科書