现在的位置: 首页 > 综合 > 正文

try..catch..finally 语句

2013年09月12日 ⁄ 综合 ⁄ 共 3381字 ⁄ 字号 评论关闭

try {// ... try 块... } finally { // ... finally 块... }
try { // ... try 块... }
catch(error [:ErrorType1]) // ... catch 块... }
[catch(error[:ErrorTypeN]) { // ... catch 块... }]
[finally { // ... finally 块... }]

包含一个代码块,如果该代码块内发生错误,将对错误进行响应。如果 try 代码块中的任何代码抛出错误(使用 throw 语句),则控制将传递到 catch 块(如果存在),然后传递到 finally 代码块(如果存在)。无论是否有错误被抛出,finally 代码块将总是执行。如果 try 代码块中的代码未抛出错误(也就是说,如果 try 代码块正常完成),finally 代码块中的代码仍然会执行。即使 try 代码块使用 return 语句退出,finally 代码块仍会执行。

try 代码块后面必须跟一个 catch 代码块、一个 finally 代码块,或者两者都有。一个 try 代码块可有多个 catch 代码块,但只能有一个 finally 代码块。您可以根据需要嵌套任意层数的 try 代码块。

catch 处理函数中指定的 error 参数必须是简单标识符,如 etheExceptionx。还可以为 catch 处理函数中的变量指定类型。当与多个 catch 代码块一起使用时,具有类型的错误可使您捕获从一个 try 代码块中抛出的多种类型的错误。

如果抛出的异常是对象,则当抛出的对象是指定类型的子类时,类型将匹配。如果抛出的错误属于特定类型,则处理相应错误的 catch 代码块将执行。如果抛出的异常不属于指定类型,则不执行该 catch 代码块,而是该异常自动从 try 代码块抛出,并抛至与其匹配的 catch 处理函数。

如果某个函数内抛出了错误,并且该函数不包含 catch 处理函数,则 ActionScript 解释程序将退出该函数以及任何调用方函数,直到发现一个 catch 代码块。在此过程中,在各层上都会调用 finally 处理函数。

可用性:ActionScript 1.0;Flash Lite 2.0

参数

error:Object -- 从 throw 语句抛出的表达式,通常是 Error 类或其某个子类的实例。

示例

下面的示例说明如何创建 try..finally 语句。由于 finally 代码块中的代码肯定会执行,因此,它通常用于在 try 代码块执行之后执行任何必要的清理。在下面的示例中,setInterval() 每隔 1000 毫秒(1 秒)调用一次函数。如果发生错误,则会抛出一个错误,并且该错误将由 catch 代码块捕获。无论是否出现错误,都会执行 finally 代码块。由于使用了 setInterval(),因此 clearInterval() 必须放置在 finally 代码块中,以确保从内存中清除该时间间隔。

myFunction = function () { 
 trace("this is myFunction"); 
}; 
try { 
 myInterval = setInterval(this, "myFunction", 1000); 
 throw new Error("my error"); 
} 
catch (myError:Error) { 
 trace("error caught: "+myError); 
} 
finally { 
 clearInterval(myInterval); 
 trace("error is cleared"); 
}

在下面的示例中,finally 代码块用于删除一个 ActionScript 对象,而不考虑是否发生错误。创建一个名为 Account.as 的新 AS 文件。

class Account { 
 var balance:Number = 1000; 
 function getAccountInfo():Number { 
 return (Math.round(Math.random() * 10) % 2); 
 } 
}

在 Account.as 所在的目录中,创建一个新的 AS 或 FLA 文档,然后在时间轴的第 1 帧中输入以下 ActionScript:

import Account; 
var account:Account = new Account();
try { 
 var returnVal = account.getAccountInfo(); 
 if (returnVal != 0) { 
 throw new Error("Error getting account information."); 
 } 
} 
finally { 
 if (account != null) { 
 delete account; 
 } 
}

下面的示例说明 try..catch 语句。执行 try 代码块内的代码。如果 try 代码块中的任何代码抛出了异常,则控制将传递到 catch 代码块,该代码块使用 Error.toString() 方法在一个文本字段中显示错误消息。

在 Account.as 所在的目录中,创建一个新的 FLA 文档,然后在时间轴的第 1 帧中输入以下 ActionScript:

import Account; 
var account:Account = new Account(); 
try { 
 var returnVal = account.getAccountInfo(); 
 if (returnVal != 0) { 
 throw new Error("Error getting account information."); 
 } 
 trace("success"); 
} 
catch (e) { 
 this.createTextField("status_txt", this.getNextHighestDepth(), 0, 0, 100, 22); 
 status_txt.autoSize = true; 
 status_txt.text = e.toString(); 
}

下面的示例说明了一个 try 代码块,该代码块带有多个指定了类型的 catch 代码块。根据所出现的错误的类型,try 代码块将抛出不同类型的对象。本例中,myRecordSet 是一个名为 RecordSet 的类(假设有这样一个类)的实例,该类的 sortRows() 方法可以抛出两种类型的错误:RecordSetException 和 MalformedRecord。

在下面的示例中,RecordSetException 和 MalformedRecord 对象是 Error 类的子类。它们都是在其自己的 AS 类文件中定义的。

// 在 RecordSetException.as 中: 
class RecordSetException extends Error { 
 var message = "Record set exception occurred."; 
} 
// 在 MalformedRecord.as 中: 
class MalformedRecord extends Error { 
 var message = "Malformed record exception occurred."; 
}

在 RecordSet 类的 sortRows() 方法内,根据所发生的异常的类型抛出这些先前定义的错误对象中的一个。下面的示例说明此代码的外观:

class RecordSet { 
 function sortRows() { 
 var returnVal:Number = randomNum(); 
 if (returnVal == 1) { 
 throw new RecordSetException(); 
 } 
 else if (returnVal == 2) { 
 throw new MalformedRecord(); 
 } 
 }
 function randomNum():Number { 
 return Math.round(Math.random() * 10) % 3; 
 }
}

最后,在另一个 AS 文件或 FLA 脚本中,下面的代码调用一个 RecordSet 类实例的 sortRows() 方法。它针对 sortRows() 抛出的每种类型的错误定义了相应的 catch 代码块

import RecordSet; 
var myRecordSet:RecordSet = new RecordSet();
try { 
 myRecordSet.sortRows(); 
 trace("everything is fine"); 
} 
catch (e:RecordSetException) { 
 trace(e.toString()); 
} 
catch (e:MalformedRecord) { 
 trace(e.toString()); 
}

抱歉!评论已关闭.