得编程语言中最让人不解的部分就是它能够创建错误。当时对Java语言中的throw关键字的第一反应就是“啊,这也太傻了,为什么我们想要引发一个错误(error)?”我觉得错误是我的敌人,应当避免的,所以创建错误是毫无用处甚至是危险的。我认为在JavaScript中加入这样的关键字是多此一举。

但随着我编程经验的丰富,我逐渐变成了throw我的error粉丝。合理的使用它们会让对代码的调试和维护大大简化。

在编程的时候,Error通常出现在不期望的事情发生时。可能是传入函数的参数值不正确,或者是运算符的操作数不合法。为此编程语言定义了一个基本的规则:当上述情况发生时,就产生一个错误来让编程人员对代码进行修复。

如果这些错误不被抛出或反馈给你,那么调试程序几乎是不可能的。如果所有的错误都“悄悄地”发生,那么你很难在第一时间发现问题所在,并将其修复。因此Error是开发者的朋友,而不是敌人。

Error的问题所在是它们会在错误的时间和错误的地点发生。

更糟的是,默认的错误信息通常晦涩难懂,很难解释哪里出了问题。JavaScirpt的错误信息更是不包含任何有价值的信息,而且还很隐蔽(尤其是在IE里运行时)。想象一下如果能有这样的错误提示出现“因为某件事情发生导致某个函数调用失败 ”,那么立刻我们的调试任务就变得简单了,这就是throw自己的error的好处。

我们可以把error想象成内嵌的异常类。在代码的某个特定的地点估计异常的发生肯定要比在所有的地方等待异常的发生要简单。这不光在代码编写中,在产品设计中也是一个普遍认同的原则。就像在轿车上设计了挤压区域和框架,以便在受到撞击时会以期望的方式发生变形。

因为知道了框架在受到撞击时会如何变形,哪些零件会失效,这样制造商就可以造出保证乘客安全的汽车。我们的代码也可以按照这样的思想编写。

虽然最近几年JavaScript有了很多进步,但是相比于其它语言的开发者,JavaScript开发者仍然只有少得可怜的调试工具。

因此在 JavaScript中throw error就显得比其它语言更有价值。我们可以用throw关键字来抛出一个对象。我们可以抛出任何类型的对象,不过Error对象是最常用的:

throw new Error("Something bad happened。

")

当我们用这样的方式抛出错误,而这个错误又不被try-catch捕获时,浏览器就会用其通常的方式显示上面的错误信息(Something bad happened)。在IE里会在浏览器的左下角出现一个小图标,当双击图标时会弹出一个带着上面错误提示的对话框;安装有Firebug插件的火狐浏览器会在控制台显示错误信息;Safar和Chrome会在Web Inspector中显示;Opera会在错误控制台显示。

一句话,它们会像你没有抛出错误时一样处理。但不同的是它会通过浏览器向你提供具体的信息,而不是一个发生错误的行列号。你可以为错误信息加入任何需要的信息,来帮你成功解决问题。我建议在错误信息中提供发生错误的函数名称以及错误原因。看下面这个函数:

function addClass(element, className){element。

className += " " + className;}

这个函数的功能是向一个给定的element加入新的CSS class(这在JavaScript中非常普遍)。但如果element是null的时候会发生什么?你会得到一个这样的错误提示“object expected”,很隐晦。

然后你需要查看执行堆栈(如果浏览器支持这个功能)来准确定位错误的源头。如果我们抛出一个错误调试就变得简单了:

function addClass(element, className){if (element != null && typeof element。

className == "string"){element。className += " " + className;} else {throw new Error("addClass(): First arg must be a DOM element。

");}}

先不讨论如何精确的判断对象是否是一个DOM element,这个方法现在能够在非法的element参数传入时提供一个更明确的错误信息。看到了如此详尽的错误描述你就能立刻找到错误的源头了。我习惯把throw error看作是贴一个任务贴纸,告诉我错误的原因。

懂得了如何throw error只是事情的一半;懂得何时throw error则是另一半。因为JavaScript并不对参数进行类型检查,许多开发者都错误的认为他们应该在所有的函数中进行该检查。那样的话是不实际的,而且会降低脚本的执行效率。

问题的关键在于找到最有可能出错的代码部分,并且只在那里throw error。一句话就是只在已经发生error的地方throw error。

如果一个函数只被一个已知的实体调用,那么错误检查基本上是没有必要的(例如私有函数就是这样);如果你不能事先确定所有函数被调用的地点,那么你需要进行错误检查并throw自己的error。

throw error最好的地方是功能函数,那些是脚本环境基本组成部分的,而且可以在任意地点被调用的函数。JavaScript的库函数就是这样的例子。

所有JavaScript的库函数都应当为已知的错误条件从它们的公共接口throw error。

对于YUI,jQuery以及Dojo等等,我们无法确定会在何时何处调用它们的库函数。所以当你犯错时对你进行提示就是这些库函数的任务。为什么呢?因为你不可能到库函数内部去找出错误所在。error的调用堆栈应当终止于库函数接口,不要再深入。没有什么比在12层函数嵌套中寻找错误更遭的事了;库函数开发人员有责任预防这种事情的发生。

这一条同样适用于私有的JavaScript库函数。许多Web应用程序都有它们自己专属的JavaScript库,可能是通过这些库来构建的,也可能是用库来代替公共的操作。库函数的作用是降低开发难度,这是通过向人们提供其抽象表达而不是复杂的实现细节来实现的。

throw error可以让这些复杂的实现隐藏在安全的地方不被开发者发现。

JavaScript同样提供了try-catch语句,用来在浏览器处理之前捕获被throw的error。开发者常常会为到底是仅仅throw error还是用try-catch将其捕获而犹豫不决。

我们应当只在程序栈的最底层throw error,就像前面提到的,最典型的就是JavaScript库函数。所有应用程序都应当在逻辑上具有处理error的能力,因此应当在底层模块中捕获 error。

在应用程序逻辑中我们总是知道为什么要调用某个函数,因此它们非常适合处理error。

有一点要引起注意,就是永远不要在try-catch结构中使用空的catch语句;你应当用某种方法处理错误。这钟处理在开发中和最终生产时会有些不同,但必须进行处理。当错误发生时,不应当仅仅将其包裹在try- catch里不管——这是掩盖错误而不是解决错误。

在JavaScript中throw error是一门艺术。在代码中找到适当的throw error的地点会花费一些时间。不过一旦你找到了这些地点,你的调试时间就会大大降低,而你对代码的满意度会获得提升。

全部

如何合理使用java异常_如何更合理的利用Java中的异常抛出?相关推荐

  1. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...

    查了一下资料,发现正则表达式竟然可以用来检查素数(http://coolshell.cn/articles/2704.html)!(由于工作需要,几年前开始接触.利用正则表达式,给工作带了很大方便,也 ...

  2. python中什么是异常_一文教你读懂 Python 中的异常信息

    在写 Python 代码的时候,当代码中出现错误,会在输出的时候打印 Traceback  错误信息,很多初学者看到那一堆错误信息,往往都会处于懵逼状态,脑中总会冒出一句,这都是些啥玩意.如果你是第一 ...

  3. java如何捕获多个异常_是否可以在单个catch块中捕获多个Java异常?

    例外是程序执行期间发生的问题(运行时错误).发生异常时,程序会突然终止,并且生成异常的行之后的代码将永远不会执行. 代码中有多个异常 在Java 7之前,只要我们有一个可能会生成多个异常的代码,并且如 ...

  4. 安卓java模拟器_用大白话告诉你:Java 后端到底是在做什么?

    作者:黄小斜 阅读本文大概需要 6 分钟. 新手程序员通常会走入一个误区,就是认为学习了一门语言,就可以称为是某某语言工程师了.但事实上真的是这样吗?其实并非如此. 今天我们就来聊一聊,Java 开发 ...

  5. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  6. Optional orElseThrow 错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出...

    情况说明 以下代码: Optional.ofNullable(u).map(u->{.... }).orElseThrow(()->{throw new CommonException(& ...

  7. 错误:未报告的异常错误,必须对其进行捕获或声明以便抛出

    错误:未报告的异常错误,必须对其进行捕获或声明以便抛出 出现错误:是因为没有对异常进行捕获或声明 首先说一下Java 中throws的作用: 假如函数部分有不合法的异常,例如分母为0: import ...

  8. 出现“未报告的异常错误,必须对其进行捕获或声明以便抛出”的解决

    错误:未报告的异常错误,必须对其进行捕获或声明以便抛出 出现错误:是因为没有对异常进行捕获或声明 首先说一下Java 中throws的作用: 假如函数部分有不合法的异常,例如分母为0: import ...

  9. java中的throw_java 中Throw能抛出的是什么?

    java 中Throw能抛出的是什么? A:ERROR B:Event 选D Error Exception 都是Throwable的子类 RunTimeException 是Exception的子类 ...

最新文章

  1. 14岁清华本科新生免试直博!高校新生大数据陆续曝光,男女比例、年龄差距各异......
  2. R语言tidyr包pivot_longer函数、pivot_wider函数数据表变换实战(长表到宽表、宽表到长表)
  3. Entity Framework技术系列之1:数据访问技术概述
  4. python随机补边缘border
  5. Debian GNU/Linux 9 将切换至 GCC6 编译器
  6. javaweb学习总结(八):HttpServletResponse对象(二)
  7. Windows注册表操作基础代码
  8. Java代码优化方案 J2ME内存优化
  9. C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题
  10. 在Vue项目中添加vue router
  11. 使用SSH从服务器下载文件
  12. 可拖拽的窗口(Vue)
  13. orgChart实现多重树状图结构
  14. pbs转换html,pbs 脚本实例说明.docx
  15. JAVA UTC时区时间相互转换
  16. CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)
  17. python微信定时发消息_python实现给微信指定好友定时发送消息
  18. 安装compiz-fusion
  19. GMK4045-ASEMI光伏逆变器二极管GMK4045
  20. Java集合判空/非空

热门文章

  1. Beyond Compare 3 许可证密钥被撤销
  2. 基础篇-verilog-按位与和逻辑与
  3. 【强化学习】Q-Learning
  4. android 原生砸金蛋 动画,C4D-砸金蛋动画效果制作
  5. 【中继协助频谱切换】基于中继协助的频谱切换机制的MATLAB仿真
  6. 【Efficient-Net】基于Efficient-Net效滤网的目标识别算法的MATLAB仿真
  7. 基于并联SVM支持向量机训练HOG特征提取的人员目标提取
  8. 那些不怕失业的程序员们,都有什么技能?
  9. el-autocomplete 使用相关问题
  10. Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0