JavaScript错误处理_javascript技巧
一.错误分类
1. 语法错误
也称为解析错误,发生在传统编程语言的编译时,在JavaScript中发生在解释时,这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释,eg,在一行代码因缺少右括号,产生了语法错误。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。
2. 运行时错误
也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。eg.
window.openMyFile();
因不存在openMyFile()方法,浏览器会返回一个异常。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。
二.处理错误
1. onerror事件处理函数
它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。Eg.
在上述代码中,在页面载入时尝试调用不存在的函数,此时会引发一个异常。弹出“发生错误”的错误信息。但是,浏览器的错误信息也显示出来了,如何在浏览器上隐藏它呢,只需onerror方法返回一个true即可。
1) 取出错误信息
onerror处理函数提供了三种信息来确定错误确切的性质:
i)错误信息——对于给定错误,浏览器会显示同样的信息;
ii)URL——在哪个文件中发生了错误;
行号——给定URL中发生错误的行号。
访问方法见如下例子:
2) 图像载入错误
window对象并非唯一支持onerror事件处理函数的对象,它对图像对象也提供支持。当一个图像由于文件不存在等原因未能成功载入时,error事件便在这个图像上触发。让我们来看一个例子:
上例直接在HTML中分配onerror事件处理函数。当然也可以通过脚本来分配事件处理函数,在设置图像的src特性前,必须等待页面完全载入,代码如下:
注意:与window对象的onerror事件处理函数不同,image的onerror事件任何的额外信息的参数。
3) 处理语法错误
onerror还能处理语法错误。但有一点必须注意,事件处理函数必须是页面中第一个出现的代码,因为如果语法错误出现在设置事件处理函数之前出现,事件处理函数就没有用了。
注意:语法错误会完全停止代码的执行。
说明:使用onerror事件处理函数的主要的问题是,它是BOM的一部分,所以,没有任何标准能控制它的行为。因此,不同的浏览器使用这个事件处理错误的方式有明显的不同,eg,在IE中发生error事件时,正常的代码会继续执行,所有的变量和数据都保留下来,并可通过onerror事件处理函数访问。在Mozilla中,正常的代码执行都会结束,同时所有的错误发生之前的变量和数据都被销毁。
2. try…catch语句
ECMPScript第三版,引入了try…catch语句。Eg.
try {
window.openFile1();
alert("成功调用openFile1方法");
} catch (exception) {
alert("发生异常!");
} finally {
alert("try..catch测试结束!");
}
与Java不同,ECMAScript标准在try…catch语句中只能有一个catch语句,因为JavaScript是弱类型的语言,没办法指明catch子句中异常的特定类型。不管错误是什么类型,都由同一个catch语句处理。但Mozilla对其进行了扩展,可加多个catch语句,不推荐这样使用。
finally用于包含无论是否有异常发生都要执行的代码,这对关闭打开的链接和释放资源很有用。
1) 嵌套try…catch语句
用来处理catch子句中的错误问题,让我们来看一个例子,代码如下:
try {
eval("a ++ b");
} catch(oException) {
alert("发生错误!");
try {
var aError = new Array(1000000000000000000000000000000000000000);
} catch(exception) {
alert("在catch子句中发生错误!");
}
} finally{
alert("已完成")
}
2) Error对象
发生错误时,JavaScript有个Error基类用于抛出。它有两个特性:
i)name——表示错误类型的字符串
ii)message——实际的错误信息。
Error对象的name对应于它的类,可以是如下值之一:
EvalError:错误发生在eval()函数中;
RangeError:数字值超出JavaScript可表示的范围;
ReferenceError:使用了非法的引用;
SyntaxError:在eval()函数调用中发生了语法错误,其他的愈发错误由浏览器报告,无法通过try…catch处理;
TypeError:变量的类型不是预期所需的;
URIError:在encodeURI或decodeURI函数发生了错误。
3) 判断错误类型
可采取如下两种方法来判断错误类型,第一种根据异常的name属性判断,如下:
try {
eval("a ++ b");
} catch(oException) {
if (oException.name = "SyntaxError") {
alert("发生SyntaxError!");
} else {
alert("发生其他错误!");
}
}
第二中采用instanceof操作符,代码如下:
try {
eval("a ++ b");
} catch(oException) {
if (oException instanceof SyntaxError) {
alert("发生SyntaxError!");
} else {
alert("发生其他错误!");
}
}
4) 抛出异常的throw语句
在ECMAScript第三版引入,用于有目的的抛出异常,抛出的错误对象可为字符串、数字、布尔值或实际的对象,也可以抛出Error对象(其构造函数只有一个函数,即错误信息)。eg1. throw new Error(“错误产生!”);
eg2.
function addTwoNumber(a, b) {
if (arguments.length throw new Error("需要传入两个数字!");
}
}
try {
result = addTwoNumber(90);
} catch(oException) {
if (oException instanceof SyntaxError) {
alert("SyntaxError:" + oException.message);
} else if (oException instanceof Error){
alert(oException.message);
}
}
以上就是本文所述的全部内容了,希望小伙伴们能够喜欢。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

使用中间件改善Go函数中的错误处理:引入中间件的概念,它可以拦截函数调用并执行特定逻辑。创建错误处理中间件,该中间件将错误处理逻辑包装在自定义函数中。使用中间件包装处理程序函数,以便在函数调用之前执行错误处理逻辑。根据错误类型返回适当的错误代码,улучшениеобработкиошибоквфункцияхGoспомощьюпромежуточногопрограммногообеспечения.Онопозволяетнамсосредоточитьсянаобработкеошибо

在C++中,异常处理通过try-catch块优雅地处理错误,常见的异常类型包括运行时错误、逻辑错误和超出界限错误。以文件打开错误处理为例,当程序打开文件失败时,它会抛出异常,并通过catch块打印错误消息和返回错误代码,从而在不终止程序的情况下处理错误。异常处理提供错误处理集中化、错误传递和代码健壮性等优势。

PHP中最佳的错误处理工具和库包括:内置方法:set_error_handler()和error_get_last()第三方工具包:Whoops(调试和错误格式化)第三方服务:Sentry(错误报告和监控)第三方库:PHP-error-handler(自定义错误日志记录和堆栈跟踪)和Monolog(错误日志记录处理器)

在Go函数中,异步错误处理通过使用error通道,异步地从goroutine传递错误。具体步骤如下:创建一个error通道。启动一个goroutine来执行操作并异步发送错误。使用select语句从通道接收错误。异步处理错误,例如打印或记录错误消息。该方法可以提高并发代码的性能和可伸缩性,因为错误处理不会阻塞调用线程,并且可以取消执行。

在Go函数单元测试中,错误处理有两种主要策略:1.将错误表示为error类型的具体值,用于断言预期值;2.使用通道向测试函数传递错误,适用于测试并发代码。实战案例中,使用错误值策略确保函数对负数输入返回0。

C++类设计中的错误处理和日志记录包括:异常处理:捕获并处理异常,使用自定义异常类提供特定错误信息。错误码:使用整数或枚举表示错误条件,在返回值中返回。断言:验证预置和后置条件,不成立时引发异常。C++库日志:使用std::cerr和std::clog进行基本日志记录。外部日志库:集成第三方库以获得高级功能,如级别过滤和日志文件旋转。自定义日志类:创建自己的日志类,抽象底层机制,提供通用接口记录不同级别信息。

在Golang中,错误包装器允许你在原始错误上追加上下文信息,从而创建新错误。这可用于统一不同库或组件抛出的错误类型,简化调试和错误处理。步骤如下:使用errors.Wrap函数将原有错误包装成新错误。新错误包含原始错误的上下文信息。使用fmt.Printf输出包装后的错误,提供更多上下文和可操作性。在处理不同类型的错误时,使用errors.Wrap函数统一错误类型。

Go中优雅地处理错误有两种方法:defer语句用于在函数返回前执行代码,通常用于释放资源或记录错误。recover语句用于捕获函数中的panic,并允许程序以更优雅的方式处理错误,而不是崩溃。
