處理錯誤

1.17. 處理錯誤
 
問題
我想讓程序自己檢測和處理遇到的錯誤。
解決辦法
當檢測到錯誤時使用 throw 語句拋出異常。把可能出現錯誤的代碼都放到 try 塊中,然後在catch 塊中進行錯誤處理。
討論
Flash 播放器 8.5 開始支持 try/catch 方法來處理錯誤。這意味着可以靈活的處理遇到的錯誤了。除了語法錯誤(這時編譯器就通不過),其他類型的錯誤如非法數據等都可以自己處理。
處理異常包括兩個部分,拋出異常和捕獲異常。有些異常系統會自動拋出,比如 IllegalOperationError, MemoryError, 和 ScriptTimeoutError. 它們都在 flash.errors 包中。除了系統定義的錯誤外也可以拋出自定義錯誤,然後捕獲它進行處理。使用 throw 語句拋出一個Error 對象或Error 子類實例,比如:
throw new Error("A general error occurred.");
正如我們看到的,Error 構造器接受一個參數,這個信息和這個錯誤相關聯。這個參數是可選的,依賴於你怎樣處理這個錯誤,你可以不使用,但是大多數情況下都指定一個錯誤信息作爲調試目的。
一旦異常被拋出,Flash就會暫停當前進程去尋找 catch 塊去處理異常。任何有潛在錯誤的代碼都要放在 try 塊中,如果異常拋出,只有它所在的 try 塊被暫停,然後相關聯的 catch 塊被調用,看下面的例子:
try {
  trace("This code is about to throw an error.");
  throw new Error("A general error occurred.");
  trace("This line won't run");
}
catch (errObject:Error) {
  trace("The catch block has been called.");
  trace("The message is: " + errObject.message);
}

上面的代碼數出以下信息:
This code is about to throw an error.
The catch block has been called.
The message is: A general error occurred.
當然,上面的代碼還是過於簡單,但是這是個基本框架,可以看到只要拋出異常,try 塊就會退出,catch 塊被執行,傳遞了一個 Error 對象給 catch.
更多情況下,異常是從函數或方法中拋出的,Flash 會檢測該函數是否在 try 塊內被調用,如果是,則調用相應的 catch 塊。
private function displayMessage(message:String):void {
  if(message == undefined) {
    throw new Error("No message was defined.");
  }
  trace(message);
}
 
try {
  trace("This code is about to throw an error.");
  displayMessage(  );
  trace("This line won't run");
}
catch (errObject:Error) {
  trace("The catch block has been called.");
  trace("The message is: " + errObject.message);
}
上面的代碼輸出以下內容:
This code is about to throw an error.
The catch block has been called.
The message is: No message was defined.
如果你不肯定你的函數或方法會在何時或如何拋出異常,這時就應該在try塊進行調用。
// 定一個在指定的sprite裏的畫矩形函數。
private function drawRectangle(sprite:Sprite, newWidth:Number, newHeight:Number):void {
 
  // 檢測長和寬的數值是否合法,否則拋出異常。
  if(isNaN(newWidth) || isNaN(newHeight)) {
    throw new Error("Invalid dimensions specified.");
  }
 
  // 如無異常,則畫出矩形
  sprite.graphics.lineStyle(1, 0, 1);
  sprite.graphics.lineTo(nWidth, 0);
  sprite.graphics.lineTo(nWidth, nHeight);
  sprite.graphics.lineTo(0, nHeight);
  sprite.graphics.lineTo(0, 0);
}
現在我們在 try/catch 語句內調用該函數。
try {
  drawRectangle(this, widthB, heightB);
}
catch(errObject:Error) {
  this.graphics.clear(  );
  tOutput.text = "An error occurred: " + errObject.message;
}
另外對於try/catch 語句,還可以加入 finally 塊,finally 塊包含的代碼無論是否遇到異常都會被執行。例如下面的兩個例子效果相同:
//沒有使用finally:
private function displayMessage(message:String):void {
  try {
    if(message == undefined) {
      throw new Error("The message is undefined.");
    }
    trace(message);
  }
  catch (errObject:Error) {
    trace(errObject.message);
  }
  trace("This is the last line displayed.");
}
//使用 finally:
private function displayMessage(message:String):void {
  try {
    if(message == undefined) {
      throw new Error("The message is undefined.");
    }
    trace(message);
  }
  catch (errObject:Error) {
    trace(errObject.message);
  }
  finally {
    trace("This is the last line displayed.");
  }
}

如果在catch中使用了return語句,那結果就不一樣了:
//沒有使用finally:
private function displayMessage(message:String):void {
  try {
    if(message == undefined) {
      throw new Error("The message is undefined.");
    }
    trace(message);
  }
  catch (errObject:Error) {
    trace(errObject.message);
    return;
  }
  // 這一句沒有執行.
  trace("This is the last line displayed.");
}

//使用 finally:
private function displayMessage(message:String):void {
  try {
    if(message == undefined) {
      throw new Error("The message is undefined.");
    }
    trace(message);
  }
  catch (errObject:Error) {
    trace(errObject.message);
    return;
  }
  finally {
    // 執行,不管是否有異常發生。
    trace("This is the last line displayed.");
  }
}

通過這一節的學習,現在你可以建立複雜的異常處理系統。

 
發佈了20 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章