`
lixinye0123
  • 浏览: 333339 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

1.17. 处理错误

阅读更多

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.");
  }
}

通过这一节的学习,现在你可以建立复杂的异常处理系统。 

分享到:
评论

相关推荐

    nginx-1.17.7.tar.gz

    Nginx 1.17.7 是一个流行的开源Web服务器的更新版本,它以其高性能、稳定性以及对高并发处理能力而闻名。这个版本可能看起来与前一版本的变化不大,但每个小更新都可能包含性能优化、安全修复或新功能的引入,这对于...

    go1.17.7.linux-amd64.zip

    此外,Go还提供了丰富的标准库,包括网络编程、文件操作、错误处理等,为开发者提供了极大的便利。 **版本1.17.7**: 这是Go语言的一个特定版本,每个版本可能会包含性能优化、新特性的引入、已知问题的修复等。1.17...

    nginx-1.17.7.zip

    Bugfix:使用"error_page"指令返回重定向时,带有正文的请求会被错误处理;该错误在 0.7.12 中出现过 Bugfix:使用 HTTP/2 时出现 socket 泄漏的情况 Bugfix:在 SSL 连接中处理流水线请求时可能会发生超时; 该...

    nginx-1.17.10.zip

    **Nginx 1.17.10 Windows 版详解** Nginx 是一款高性能、轻量级的Web服务器/反向代理服务器,广泛应用于互联网服务,以其高并发、低内存消耗和丰富的模块化设计而闻名。在这个“nginx-1.17.10.zip”压缩包中,包含...

    nginx-1.17.8-win.zip

    4. **logs**:默认的日志文件目录,Nginx 会将访问和错误日志保存在此处。 5. **temp**:临时文件目录,Nginx 在处理请求时可能会生成一些临时文件。 6. **html**:默认的网页根目录,存放静态网页资源。 7. **...

    nginx-1.17.8.zip

    8. **日志记录**:Nginx能够记录访问日志,通过`access.log`和`error.log`文件收集服务器运行状态和错误信息,便于监控和调试。 9. **缓存功能**:Nginx可以作为缓存服务器,存储经常访问的资源,提高响应速度,...

    nginx-1.17.9_nginx_

    4. **日志管理**:Nginx 的错误日志和访问日志默认分别存储在 `/var/log/nginx/error.log` 和 `/var/log/nginx/access.log`。 **四、Nginx 负载均衡策略** 1. **轮询**:每个请求按时间顺序轮流分配到不同的后端...

    Python库 | mypy-boto3-fis-1.17.83.tar.gz

    Python库是开发者用于扩展Python功能的代码集合,它们可以提供各种功能,如数据处理、网络通信、图形界面等。在这个案例中,"mypy-boto3-fis"可能是一个专门为Amazon Web Services (AWS) 的Financial Insights ...

    PyPI 官网下载 | mypy-boto3-cur-1.17.87.tar.gz

    这个压缩包的版本号是1.17.87,通常版本号的更新意味着修复了错误、增加了新功能或进行了性能优化。 描述中提到“资源全名:mypy-boto3-cur-1.17.87.tar.gz”,确认了压缩包的完整名称,同时暗示了这是通过官方渠道...

    PyPI 官网下载 | mypy-boto3-nimble-1.17.97.tar.gz

    描述中提到的"资源全名:mypy-boto3-nimble-1.17.97.tar.gz"再次确认了我们正在处理的文件类型——一个tarball(.tar.gz)文件,这是在Unix-like系统中常用的文件打包格式,它将多个文件和目录压缩在一起便于传输和...

    PyPI 官网下载 | perseus-restful-api-framework-1.17.32.tar.gz

    2. 错误处理:框架可能增强了错误处理机制,提供更详细的错误信息,帮助开发者更快地定位和解决问题。 3. 更强的路由系统:Perseus可能引入了更灵活的路由规则,使得API接口的定义更加直观和易用。 4. 集成测试...

    PyPI 官网下载 | mypy-boto3-dynamodbstreams-1.17.99.tar.gz

    `mypy-boto3-dynamodbstreams-1.17.99.tar.gz`是PyPI上发布的一个特定版本的Python库压缩包。 描述中提到的"资源全名:mypy-boto3-dynamodbstreams-1.17.99.tar.gz",表明这个资源是`mypy-boto3-dynamodbstreams`库...

    PyPI 官网下载 | mypy-boto3-machinelearning-1.17.102.post1.tar.gz

    在PyPI官网上,我们可以找到名为“mypy-boto3-machinelearning-1.17.102.post1.tar.gz”的资源,这是一款针对Python的特定库,专门用于处理Boto3中的机器学习操作。这个压缩包文件的全名揭示了它的核心功能和版本...

    PyPI 官网下载 | mypy-boto3-mediaconnect-1.17.69.0.post1.tar.gz

    《PyPI官网下载:mypy-boto3-mediaconnect-1.17.69.0.post1.tar.gz详解》 PyPI(Python Package Index),是Python开发者常用的资源库,其中...对于处理实时流媒体传输的Python项目来说,这是一个非常有价值的资源。

    PyPI 官网下载 | mypy-boto3-greengrass-1.17.105.tar.gz

    在动态类型的Python中,mypy允许开发者在不改变运行时行为的情况下添加类型注解,从而在编译阶段捕获可能的类型错误,提高了代码的可靠性和可维护性。mypy-boto3-greengrass库结合了mypy的功能,为使用Boto3和...

    PyPI 官网下载 | mypy-boto3-sso-1.17.18.0.tar.gz

    总的来说,"mypy-boto3-sso-1.17.18.0.tar.gz"是一个针对AWS SSO的类型检查增强库,它结合了mypy的静态类型检查和boto3的AWS服务访问能力,提升了Python开发者在处理AWS SSO时的代码质量和效率。在实际使用中,...

    PyPI 官网下载 | mypy-boto3-translate-1.17.43.0.tar.gz

    资源的全名是`mypy-boto3-translate-1.17.43.0.tar.gz`,其中`1.17.43.0`是该库的版本号,通常版本号的更新意味着修复了错误、增加了新功能或改进了性能。 标签"Python库"表明这是一份用于Python编程的软件包,可能...

    PyPI 官网下载 | mypy-boto3-athena-1.17.5.0.tar.gz

    《PyPI官网下载:mypy-boto3-athena-1.17.5.0.tar.gz——Python库解析》 PyPI(Python Package Index)是Python开发者们分享和获取Python软件包的主要平台,它是Python生态系统的核心组成部分。在这个平台上,我们...

Global site tag (gtag.js) - Google Analytics