JS异常处理的一个想法(sofish)

下面是详细的文本攻略。

简介

JS异常处理的一个想法,是由前端开发者sofish提出的一种异常处理方案。这种方案能够减少代码中try-catch的使用,减少代码冗余,提高代码的可读性。

原理

这种方案的核心思想是使用事件代理,对于代码中可能出现的异常情况,可以在全局统一进行处理。事件代理通过监听window对象下的错误事件,可以捕获到应用中的所有异常。

实现步骤

  1. 在window对象上注册错误事件处理函数,捕获应用程序中所有的异常。
  2. 在事件处理函数中,通过异常信息判断出可能引发异常的代码位置,然后调用相应的代码处理函数。
  3. 开发过程中只需要在相应处理函数中实现具体的异常处理逻辑。
// 1. 我们需要监听全局错误事件
window.addEventListener('error', function(event) {
  // 2. 对捕获的异常进行信息提取
  let errMsg = event.message; // 错误信息
  let targetUrl = event.filename; // 出错文件URL
  let row = event.lineno; // 出错行号
  let col = event.colno; // 出错列号
  let errorObj = event.error; // 错误堆栈对象
  // 3. 根据提取的信息进行相应的处理
  if(targetUrl.indexOf('a.js') > -1) {
    handleErrorA();
  } else if(targetUrl.indexOf('b.js') > -1) {
    handleErrorB();
  } else {
    handleErrorDefault();
  }
});

示例说明

在以下两个示例中,我们分别模拟了两个常见的错误情况——网络请求失败和页面资源加载失败,并使用上述异常处理方案进行了处理。

  1. 网络请求失败
// 封装一个网络请求函数
function request(url) {
  return new Promise((resolve, reject) => {
    let xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      if(xhr.readyState === 4 && xhr.status === 200) {
        resolve(xhr.responseText);
      }
    }
    xhr.onerror = function(err) {
      throw new Error('网络请求失败');
    }
    xhr.open('GET', url, true);
    xhr.send();
  });
}

// 异常处理函数
function handleRequestError() {
  // 显示错误提示信息
  alert('网络请求失败,请检查您的网络设置!');
}

// 监听全局错误事件,并进行处理
window.addEventListener('error', function(event) {
  let errMsg = event.message;
  let targetUrl = event.filename;
  let errorObj = event.error;
  if(errMsg === '网络请求失败') {
    handleRequestError();
  }
});

// 测试代码
request('http://baidu.com').then(res => console.log(res)).catch(err => console.error(err));
  1. 页面资源加载失败
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>页面资源加载失败测试</title>
  <link rel="stylesheet" href="./index.css">
  <script src="./index.js"></script>
  <script>
    // 异常处理函数
    function handleLoadError() {
      // 显示错误提示信息
      alert('页面资源加载失败,请检查网站配置!');
    }
    // 监听全局错误事件,并进行处理
    window.addEventListener('error', function(event) {
      let errMsg = event.message;
      let targetUrl = event.filename;
      let errorObj = event.error;
      if(targetUrl.indexOf('index.css') > -1 || targetUrl.indexOf('index.js') > -1) {
        handleLoadError();
      }
    });
  </script>
</head>
<body>
  <h1>页面资源加载失败测试</h1>
</body>
</html>

希望这份攻略能够对你理解sofish大神的异常处理方案有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS异常处理的一个想法(sofish) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 跨站攻击之实现Http会话劫持的手法

    跨站攻击(Cross-Site Attack)又称为XSS攻击,是指攻击者在网页中插入恶意脚本,使受害者在访问网页时,网页中的恶意脚本被执行从而攻击受害者。跨站攻击有很多种形式,其中之一就是Http会话劫持,下面我们来看看这种手法的攻略。 什么是Http会话劫持 Http会话劫持是指攻击者在网站上注入一段代码,通过劫持用户已经建立的会话从而获取用户的权限、获…

    JavaScript 2023年6月11日
    00
  • JavaScript Timer实现代码

    下面我来介绍怎么实现JavaScript Timer。 一、概述 JavaScript Timer是一种可以在特定时间间隔内重复执行代码的方法。通常在需要动态更新UI元素、周期性发送数据、定期清理缓存等大量场景中都会采用JS Timer。 二、实现过程 在JavaScript中实现定时器有多种方法,如: 1. setInterval和clearInterva…

    JavaScript 2023年5月27日
    00
  • Javascript 获取链接(url)参数的方法[正则与截取字符串]

    当需要在JavaScript中获取链接(URL)的参数时,通常我们会考虑使用正则表达式(RegExp)或者简单地截取字符串两种方法来完成。下面,本文将为大家细细讲解这两种方法的具体实现。 方法一:使用正则表达式 1. 获取单个参数的值 假设一个链接为:https://www.example.com/?name=John&age=26&gend…

    JavaScript 2023年5月28日
    00
  • javascript完美实现给定日期返回上月日期的方法

    JavaScript完美实现给定日期返回上月日期的方法 如果你需要在JavaScript中获取一个日期的上个月日期,本文将为你提供两种方法。 方法一:日期计算 我们可以使用JavaScript的Date对象的setMonth()函数通过将当前月份减一来获得上个月的日期。 function getLastMonthDate(date) { var d = ne…

    JavaScript 2023年6月10日
    00
  • 个人网站留言页面(前端jQuery编写、后台php读写MySQL)

    下面给出关于“个人网站留言页面(前端jQuery编写、后台php读写MySQL)”的完整攻略。 步骤一:数据库设计 首先需要通过设计数据库来存储留言信息。假设我们需要存储“留言者姓名”、“留言内容”、“留言时间”等信息,可以创建一个名为”messageBoard”的MySQL数据库,并在其中新建一个名为”messages”的表来存储留言。 CREATE DA…

    JavaScript 2023年6月11日
    00
  • 文件的读出 编辑 管理

    文件的读出 编辑 管理 文件的读出 编辑 管理指的是针对文本文件进行查看、修改和删除操作。在操作时,我们可以使用命令行或者各种编辑器来实现对文件的管理。 文件的读出 我们可以使用命令行端(Linux或者Windows命令行)来实现对文件的读出。具体操作如下: 打开命令行(Linux终端或者Windows命令提示符)。 进入到对应的文件所在的目录下。 输入命令…

    JavaScript 2023年6月10日
    00
  • 用javascript父窗口控制只弹出一个子窗口

    要实现父窗口控制只弹出一个子窗口,需要满足以下几个步骤: 在父窗口中定义一个全局变量,用于保存打开的子窗口对象。 在打开子窗口的函数中,先判断全局变量是否为空。如果为空,说明没有打开过子窗口,那么创建新的子窗口对象并赋值给全局变量。如果不为空,说明已经存在子窗口,那么判断子窗口是否关闭,如果关闭,则再次创建新的子窗口对象并赋值给全局变量;如果没有关闭,则聚焦…

    JavaScript 2023年6月11日
    00
  • 基于ES6作用域和解构赋值详解

    基于ES6作用域和解构赋值详解 作用域 Scope 作用域是程序代码中声明变量的区域。作用域可以分为全局作用域和局部作用域。 在ES6中,可以使用let和const声明变量,这两种声明方式都是块级作用域。 示例 1 // 全局作用域 let a = 1; function test() { // 局部作用域 let b = 2; console.log(a)…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部