try..catch..finally

可用性

Flash Player 7。

用法

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

参数

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

ErrorType 可选参数;指定 error 标识符的类型。catch 子句只捕获指定类型的错误。

说明

关键字;在它们所包括的代码块内,如果发生错误,将对错误进行响应。如果 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 处理函数,则动作脚本解释器退出该函数以及任何调用函数,直到找到一个 catch 代码块。在此过程中,在各层上都会调用 finally 处理函数。

示例

下面的示例说明如何创建 try..finally 语句。由于 finally 代码块中的代码肯定会执行,因此,它通常用于在 try 代码块执行完毕后,执行必要的“清理”代码。在此示例中,finally 代码块用于删除一个动作脚本对象,而不管是否有错误发生。

var account = new Account()
try {
  var returnVal = account.getAccountInfo();
  if(returnVal != 0) {
    throw new Error("Error getting account information.");
  }
}
finally {
  // 无论是否有错误发生,都会删除“account”对象。
  if(account != null) {
    delete account;
  }
}

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

var account = new Account()
try {
  var returnVal = account.getAccountInfo();
  if(returnVal != 0) {
    throw new Error("Error getting account information.");
  }
} catch (e) {
  status_txt.text = e.toString();
}

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

在此示例中,RecordSetException 和 MalformedRecord 对象是 Error 类的子类。它们都是在其自己的 AS 类文件中定义的。(有关更多信息,请参见使用动作脚本 2.0 创建类。)

// 在 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() 方法内,将根据所发生异常的类型抛出上面定义的两个错误对象之一。下面的代码片断显示了此代码的大致结构。

// 在 RecordSet.as 类文件内...
function sortRows() {
  ...
  if(recordSetErrorCondition) {
    throw new RecordSetException();
  }
  if(malFormedRecordCondition) {
    throw new MalformedRecord();
  }
  ...
}  

最后,在另一个 AS 文件或 FLA 脚本中,以下代码对 RecordSet 类的一个实例调用
sortRows() 方法。它为 sortRows() 所抛出的各种类型的错误都分别定义了 catch 代码块。

try {
  myRecordSet.sortRows();
} catch (e:RecordSetException) {
  trace("Caught a recordset exception");
} catch (e:MalformedRecord) {
  trace("Caught a malformed record exception");
}

另请参见

Error 类throwclassextends