首页 web前端 js教程 JavaScript错误处理_javascript技巧

JavaScript错误处理_javascript技巧

May 16, 2016 pm 04:16 PM
javascript 错误处理

一.错误分类

1. 语法错误

也称为解析错误,发生在传统编程语言的编译时,在JavaScript中发生在解释时,这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释,eg,在一行代码因缺少右括号,产生了语法错误。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。

2. 运行时错误

也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。eg.

window.openMyFile();

因不存在openMyFile()方法,浏览器会返回一个异常。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。

二.处理错误

1.       onerror事件处理函数

它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。Eg.

复制代码 代码如下:

                       
   
           onerror例子
          
      
      
      

 在上述代码中,在页面载入时尝试调用不存在的函数,此时会引发一个异常。弹出“发生错误”的错误信息。但是,浏览器的错误信息也显示出来了,如何在浏览器上隐藏它呢,只需onerror方法返回一个true即可。

复制代码 代码如下:


1) 取出错误信息

onerror处理函数提供了三种信息来确定错误确切的性质:

 i)错误信息——对于给定错误,浏览器会显示同样的信息;

 ii)URL——在哪个文件中发生了错误;

行号——给定URL中发生错误的行号。

访问方法见如下例子:

复制代码 代码如下:


2) 图像载入错误

window对象并非唯一支持onerror事件处理函数的对象,它对图像对象也提供支持。当一个图像由于文件不存在等原因未能成功载入时,error事件便在这个图像上触发。让我们来看一个例子:

JavaScript错误处理_javascript技巧

上例直接在HTML中分配onerror事件处理函数。当然也可以通过脚本来分配事件处理函数,在设置图像的src特性前,必须等待页面完全载入,代码如下:

复制代码 代码如下:


   
           Image错误测试
       
      
      
              JavaScript错误处理_javascript技巧
      

注意:与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);
}
}

以上就是本文所述的全部内容了,希望小伙伴们能够喜欢。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1267
29
C# 教程
1239
24
使用中间件改善golang函数中的错误处理 使用中间件改善golang函数中的错误处理 Apr 24, 2024 pm 06:57 PM

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

通过异常处理,如何在 C++ 中有效处理错误场景? 通过异常处理,如何在 C++ 中有效处理错误场景? Jun 02, 2024 pm 12:38 PM

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

PHP 错误处理中的最佳工具和库? PHP 错误处理中的最佳工具和库? May 09, 2024 pm 09:51 PM

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

golang函数错误处理中的异步处理 golang函数错误处理中的异步处理 May 03, 2024 pm 03:06 PM

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

Go 函数单元测试的错误处理策略 Go 函数单元测试的错误处理策略 May 02, 2024 am 11:21 AM

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

C++类设计中如何进行错误处理和日志记录? C++类设计中如何进行错误处理和日志记录? Jun 02, 2024 am 09:45 AM

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

如何使用 Golang 的错误包装器? 如何使用 Golang 的错误包装器? Jun 03, 2024 pm 04:08 PM

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

如何在golang函数中优雅地处理错误 如何在golang函数中优雅地处理错误 May 01, 2024 pm 10:12 PM

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

See all articles