`
lixinye0123
  • 浏览: 323333 次
  • 性别: 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.zip

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

    小黄豆客户关系管理系统CRM v1.17.2.1116源码 XHDPowersManageThi117.rar

    小黄豆CRM v1.17.2.1116源码 源码描述: 一、【v1.17.0】更新项 1、【优化】全新的系统架构。 2、【新增】任务管理系统。 3、【新增】短信功能。 4、【新增】客户地图及标记功能。 5、【新增】内置帮助系统。 ...

    actionscript cook book 中文版

    1.17. 处理错误 26 第二章. 自定义类 29 2.0. 简介 29 2.1. 创建自定义类 30 2.2. 类的保存 32 2.3. 创建成员属性 33 2.4. 创建静态方法或属性 35 2.5. 创建子类 35 2.6. 覆盖父类方法 37 2.7. 创建常量 39 第三章. ...

    sklearn0.19中文文档

    1.1.15. 稳健回归(Robustness regression): 处理离群点 (outliers)和模型错误 1.1.15.1. 各种使用场景与相关概念 1.1.15.2. RANSAC: 随机抽样一致性算法(RANdom SAmple Consensus) 1.1.15.2.1. 算法细节 1.1....

    Recuva 1.37.0.488汉化版

    - 修正错误在数据处理(可以冻结在99%)。 - 改进支持稀疏文件。 - 小改动和修正。 v1.07.138(2007年10月24日) - 完全的Unicode(需要使用Windows 98/ME中unicows.dll)。 - 改进的恢复还原时文件名从回收站。 - ...

    flex3的cookbook书籍完整版dpf(包含目录)

    1.17节.检测对象数据类型 1.18节.接口的定义和实现 第二章. 控件与菜单(37) 2.1节. 监听按钮点击 2.2节. 创建一组状态按钮 2.3节. 使用ColorPicker设置Canvas颜色 2.4节. 使用SWFLoader载入SWF 2.5节. 设置组件的...

    FD_WinXP_SP3 说明及下载地址(完美品质)

    1、【磁盘控制器】更新 JMicron智微JMB36x/JMB37x SATA/eSATA控制器驱动1.17.60 WHQL版For WinXP(2010年11月6日发布) [2010.11.5] 1、【磁盘控制器】更新 Marvell MV91xx AHCI/RAID控制器驱动1.0.0.1045版For ...

    金蝶K3日常问题解决手册

    1.17 K310.3如何对加密服务进行加载和反加载。 12 1.18 K3不同组件的手动注册方法。 12 1.19 K3安装过程中报如图错误: 14 1.20 K3安装或注册过程报如图错误,手动注册组件无效。 15 1.21 如何手动卸载K3 15 1.22 K3...

    PHP和MySQL Web开发第4版pdf以及源码

    第7章 错误和 异常处理 7.1 异常处理的概念 7.2 Exception类 7.3 用户自定义异常 7.4 Bob的汽车零部件商店应用程序的异常 7.5 异常和PHP的其他错误处理机制 7.6 进一步学习 7.7 下一章 第二篇 使用MySQL 第...

    PHP和MySQL WEB开发(第4版)

    第7章 错误和 异常处理 7.1 异常处理的概念 7.2 Exception类 7.3 用户自定义异常 7.4 Bob的汽车零部件商店应用程序的异常 7.5 异常和PHP的其他错误处理机制 7.6 进一步学习 7.7 下一章 第二篇 使用MySQL 第8章 ...

    PHP和MySQL Web开发第4版

    第7章 错误和 异常处理 7.1 异常处理的概念 7.2 Exception类 7.3 用户自定义异常 7.4 Bob的汽车零部件商店应用程序的异常 7.5 异常和PHP的其他错误处理机制 7.6 进一步学习 7.7 下一章 第二篇 使用MySQL 第...

    C++大学教程,一本适合初学者的入门教材(part2)

    13.3 其他错误处理方法 13.4 C十十异常处理基础:try、throw、catch 13.5 简单异常处理例子:除数为o 13.6 抛出异常 13.7 捕获异常 13.8 再抛出异常 13.9 异常指定 13.10 处理意外异常 13.11 堆栈解退 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    13.3 其他错误处理方法 13.4 C十十异常处理基础:try、throw、catch 13.5 简单异常处理例子:除数为o 13.6 抛出异常 13.7 捕获异常 13.8 再抛出异常 13.9 异常指定 13.10 处理意外异常 13.11 堆栈解退 ...

    intellij-plugin-v4:ANTLR v4的IntelliJ插件

    特征: 语法高亮语法错误检查语义错误检查导航窗口转到声明查找用法重命名令牌重命名规则将解析树另存为svg / jpg / png; 在分析树视图中右键单击(1.9) 用meta- /(1.7)注释语法规则行生成Java代码; 快捷键...

    spring杂谈 作者zhang KaiTao

    1.1 Spring事务处理时自我调用的解决方案及一些实现方式的风险 1.2 我对AOP的理解 1.3 Spring开闭原则的表现-BeanPostProcessor的扩展点-1 1.4 我对IoC/DI的理解 1.5 SpringMVC + spring3.1.1 + hibernate4.1.0 集成...

    C语言深度解剖

    第一章 关键字 1.1 最宽恒大量的关键字auto 1.2 最快的关键字register 1.3 最不实名的关键字static 1.4 基本数据类型 1.5 最冤枉的关键字sizeof 1.6 if/else组合 1.7 switch/case组合 ...5.3 常见内存错误与对策

    Python基础学习笔记

    根据b站千峰教育所做的笔记 ...1.13语法错误与异常处理 1.14生成器 1.15面向对象 1.16类 1.17魔术方法 1.18私有化 1.19类继承和关联关系 1.20多态 1.21单例模式 1.22模块/包 1.23正则表达式 1.24进程/线程/协程

    Linux指令一周通 (技术图书大系).azw3

    1.17 cut指令:剪切文件 1.18 diff指令:生成差异信息 1.19 diffstat指令:diff结果的统计信息 1.20 dump指令:文件系统备份 1.21 file指令:辨识文件类型 1.22 find指令:查找目录或者文件 1.23 fsck指令:检查并...

    RWeb-crx插件

    在解码在线数据时处理错误。现在放弃 **备份您的网站数据!** 1.9 导入错误修正。 1.8 Stats +,更快加载大型在线存储,浏览器动作contextmenu label +。 1.7 改进的统计,帮助,选项自动缩进,dis /启用 **禁用从...

Global site tag (gtag.js) - Google Analytics