错误类型

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

开发和运行应用程序时,您会遇到不同类型的错误和错误术语。下面列出了主要的错误类型和术语:

  • 编译时错误,这类错误在代码编译期间由 ActionScript 编译器引发。当代码中的语法问题导致应用程序无法生成时即会发生编译时错误。

  • 运行时错误,这类错误在应用程序编译之后运行时发生。运行时错误指在 Flash 运行时(如 Adobe Flash Player 或 Adobe AIR)中播放 SWF 文件时产生的错误。大多数情况下,您会在出现运行时错误时处理这些错误,将错误报告给用户,并采取相应的步骤让应用程序继续运行。如果遇到的错误是致命错误,例如无法连接到远程网站或无法加载所需的数据,您可以使用错误处理让应用程序顺利地完成运行。

  • 同步错误是在调用函数时发生的运行时错误 — 例如,当您尝试使用特定方法但传递到该方法的参数无效时,Flash 运行时会引发异常。多数错误都是在语句执行时同步发生,并且控制流会立即传递给最适用的 catch 语句。

    例如,以下代码将会引发一个运行时错误,原因是在程序试图上载文件之前没有调用 browse() 方法:

    var fileRef:FileReference = new FileReference(); 
    try 
    { 
        fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm")); 
    } 
    catch (error:IllegalOperationError) 
    { 
        trace(error); 
        // Error #2037: Functions called in incorrect sequence, or earlier 
        // call was unsuccessful. 
    }

    在本例中,将同步引发一个运行时错误,原因是 Flash Player 断定在试图上载文件之前没有调用 browse() 方法。

    有关同步错误处理的详细信息,请参阅在应用程序中处理同步错误

  • 异步错误是在运行时期间的各个点发生的运行时错误;它们会生成事件,并使用事件侦听器捕捉事件。在异步操作中,函数发起操作但并不等待操作完成。您可以创建错误事件侦听器,以等待应用程序或用户尝试某操作。如果操作失败,则使用事件侦听器捕捉错误并响应错误事件。然后,该事件侦听器调用一个事件处理函数,以便通过一种有益的方式来响应错误事件。例如,事件处理函数可以启动一个对话框,以提示用户解决该错误。

    下面以前面提到的文件上载同步错误为例。如果在文件上载开始之前成功调用了 browse() 方法,则 Flash Player 会调度若干个事件。例如,上载开始时,将调度 open 事件。文件上载操作成功完成时,将调度 complete 事件。由于事件处理是异步进行的(即,不在特定、已知、预先指定的时间发生),因此使用 addEventListener() 方法可以侦听这些特定的事件,如以下代码所示:

    var fileRef:FileReference = new FileReference(); 
    fileRef.addEventListener(Event.SELECT, selectHandler); 
    fileRef.addEventListener(Event.OPEN, openHandler); 
    fileRef.addEventListener(Event.COMPLETE, completeHandler); 
    fileRef.browse(); 
     
    function selectHandler(event:Event):void 
    { 
        trace("...select..."); 
        var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm"); 
        request.method = URLRequestMethod.POST; 
        event.target.upload(request); 
    } 
    function openHandler(event:Event):void 
    { 
        trace("...open..."); 
    } 
    function completeHandler(event:Event):void 
    { 
        trace("...complete..."); 
    }

    有关异步错误处理的详细信息,请参阅响应错误事件和状态

  • 未捕获的异常,这类错误在引发后并没有相应的逻辑(如 catch 语句)来响应它。应用程序引发错误后,如果在当前级别或更高级别找不到适当的 catch 语句或事件处理函数来处理错误,则认为该错误是未捕获的异常。

    如果出现未捕获的错误,运行时会调度 uncaughtError 事件。此事件也称为“全局错误处理程序”。SWF 的 UncaughtErrorEvents 对象调度此事件,可通过 LoaderInfo.uncaughtErrorEvents 属性获得该对象。如果没有为 uncaughtError 事件注册任何侦听器,只要未捕获的错误不停止 SWF,运行时就会忽略未捕获的错误并尝试继续运行。

    除调度 uncaughtError 事件之外,Flash 运行时的调试器版本将通过终止当前脚本来响应未捕获的错误。然后,在 trace 语句输出中显示未捕获的错误,或将错误消息写入日志文件。如果异常对象是 Error 类或其子类的一个实例,将调用 getStackTrace() 方法。还会在 trace 语句输出或日志文件中显示堆栈跟踪信息。有关使用 Flash 运行时调试版的详细信息,请参阅使用 Flash 运行时的调试版

    注: 处理 uncaughtError 事件时,如果错误事件由 uncaughtError 事件处理函数引发,该事件处理函数将被多次调用。这将导致异常的无限循环。建议您避免这样的情况出现。