JavaScript异常处理和调试
avaScript异常处理和调试
JavaScript异常处理
开发者也可以编写自己的异常,并像JavaScript自动抛出的异常一样显示。创建异常需要用到throw语句。
捕获异常语法:
try{
可能出现异常的语句或语句块
}
catch(err)
{
处理错误的语句或语句块
}
[finally {
无论是否有异常抛出或捕获都将执行的语句或语句块
}]
JavaScript捕获异常的说明:
try 和 catch 是成对出现的。try 语句允许我们定义在执行时进行错误测试的代码块。catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。
在catch语句中可以对抛出的异常进行处理,而且后续的代码可以被继续运行不会受到影响。其中异常类型既可以是JavaScript内部的异常也可以是自己创建的异常
在异常处理中即使是很严重的语法错误,也不会导致程序中止。在try语句或语句块中可以包含多个throw语句,但是当执行到第一个throw语句时会直接跳转到catch中,不会继续执行try语句或语句块中的后续代码
在try代码中执行一次throw语句就不会再继续执行后续语句也不会抛出其他异常,因此在try语句中可以通过if语句来抛出不同种类的异常。但是当try代码中没有异常被抛出时则不运行catch语句中的代码。
finally语句
finally语句是用在try...catch语句之后用来执行异常处理后的代码的语句,不能单独使用,只能在try...catch语句后紧接着使用。无论try语句中是否有异常抛出,在try...catch语结束之后都会运行finally中的语句。
try...catch语句 参见
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/try...catch
throw 语句允许我们创建自定义错误——用技术术语说:创建或抛出异常(exception)。语法:
throw expression;
其中
Expression 要抛出的表达式,指定了异常的内容,可以是 JavaScript 字符串、数字、逻辑值或对象。
throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈(call stack)中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。
throw语句 参见:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/throw
如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。
下面给出一个例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用throw抛出异常并回应的例子</title>
</head>
<body>
<p>请输出一个 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" οnclick="myFunction()">测试输入</button>
<p id="message"></p>
<script>
function myFunction() {
var message, x;
message = document.getElementById("message");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
if(x == "") throw "值为空";
if(isNaN(x)) throw "不是数字";
x = Number(x);
if(x < 5) throw "太小";
if(x > 10) throw "太大";
}
catch(err) {
message.innerHTML = "错误: " + err;
}
}
</script>
</body>
</html>
保存文件名为:使用throw抛出异常并回应的例子.html,运行之,参见下图:
本例检测输入变量的值,你可以输入不同的值,单击“测试输入”试试,如果值是不符合要求,会抛出一个异常,catch 会捕捉到这个错误,并显示一段自定义的错误消息。
JavaScript调试
JavaScript是解释型代码,代码执行到哪里,才调试到哪里,不像是C/C++,可以进行编译,链接,也不像是Python,进行预编译。通常,如果 JavaScript 出现错误,是不会有提示信息,幸运的是,很多浏览器都内置了调试工具。有了调试工具,我们就可以设置断点 (breakpoint、代码停止执行的位置), 且可以在代码执行时检测变量。
浏览器启用调试工具一般是按下 F12 键,打开 调试工具。
假设调试如下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>断点测试示例</title>
</head>
<head>
</head>
<body>
<p id="demo"></p>
<p>注意这一行是否显示。</p>
<script>
var x = 15 * 5;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
保存文件名为:breakpoint测试示例.html
对于Edge浏览器,运行之,按下 F12 键,再安图示步骤操作,参见下图:
对于chrome浏览器,按下 F12 键,再安图示步骤操作,参见下图:
进一步学习可参见:
https://www.cnblogs.com/yzg1/p/5578363.html
https://blog.****.net/yin767833376/article/details/51656402
不再多说。
JavaScript 内置对象Error
Error 实例对象是最一般的错误类型,在它的基础上,JavaScript 还定义了其他派生错误对象,都是构造函数。
SyntaxError 对象是解析代码时发生的语法错误。
ReferenceError 对象是引用一个不存在的变量时发生的错误。
RangeError 对象是一个值超出有效范围时发生的错误。主要有几种情况,一是数组长度为负数,二是 Number 对象的方法参数超出范围,以及函数堆栈超过最大值。
TypeError 对象是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、数值等原始类型的值使用 new 命令,就会抛出这种错误,因为 new 命令的参数应该是一个构造函数
URIError 对象是 URI 相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。
EvalError 对象
eval函数没有被正确执行时,会抛出EvalError错误。该错误类型已经不再使用了,只是为了保证与以前代码兼容,才继续保留。
对此不在多说,参见:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error
【另外、InternalError 对象表示出现在JavaScript引擎内部的错误。 例如: "InternalError: too much recursion"(内部错误:递归过深)。它是非标准的,请尽量不要在生产环境中使用它!https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/InternalError 】