再学try-catch

一段代码会在出错的时候“死掉”(停止执行)并在控制台将异常打印出来。
try..catch,它会在捕捉到异常的同时不会使得代码停止执行而是可以做一些更为合理的操作,提供异常处理。

基本结构

try {
   ... 尝试执行的代码 ...
} catch(e) {
    // 如果发生异常,跳到这里
   ... 异常处理 ...
} finally {
   ... 最终会执行的代码 ...
}

try

try..catch only works for runtime errors

try-catch不能捕获读取代码出现的异常(parse-time),可以捕获运行时(runtime)抛出的异常;

try..catch works synchronously

try-catch同步工作执行
换句话说,try中的异步操作,不会被catch捕获;在异步操作中,使用try-catch捕获异常;

try {
  setTimeout(function() {
    noSuchVariable; // 代码在这里停止执行
  }, 1000);
} catch (e) {
  alert( "won't work" );
}

setTimeout(function() {
  try {
    noSuchVariable; // try..catch 处理异常!
  } catch (e) {
    alert( "error is caught here!" );
  }
}, 1000);

Error

  • 抛出异常源对象,包含具体信息
  • name: 构造器名称, 异常名称
  • message: 构造器参数, 异常详情的文字描述
  • stack(非标准) : 当前的调用栈, 一个包含引发异常的嵌套调用序列的字符串。
  • 抛出自定义的异常
    • throw new Error(message);
  • 再次抛出异常
    • catch只捕获已知的异常,而重新抛出未知的异常(具有指导意义)
function readData() {
  let json = '{ "age": 30 }';

  try {
    // ...
    blabla(); // 预料之外的异常
  } catch (e) {
    if (e.name == "SyntaxError") { // 已知,具体异常
        alert( "JSON Error: " + e.message );
    } else {
        throw e; // rethrow (*)重新抛出(不知道如何处理它)
    }
  }
}

// 最外层捕获,将异常抛到js运行时环境
try {
  readData();
} catch (e) {
  alert( "External catch got: " + e ); // 捕获到!
}

finally(最终总会执行)

Variables are local inside try..catch..finally

let,const定义的变量仅能在块级作用域下访问,可以理解为,try和catch定义的变量,不能catch和finally中访问。

finally and return

try..catch 以任何结束执行方式(包括return,抛出异常),finally也会执行

Environment-specific(全局异常)

  • nodejs

    • process.on(‘uncaughtException‘)
  • browser
    • window.onerror = function(message, url, line, col, error) {}

      • message: 异常信息;
      • url: 发生异常的代码的 URL;
      • line, col: 错误发生的代码的行号和列号;
      • error : 异常对象;
  • 应用
    • 注册异常记录服务,将异常信息同步到服务端,记录分析,发现问题,进行解决;

[来源与扩展]

https://mp.weixin.qq.com/s/jHSk4UeNmQ1ih_F5vs0jdw

https://github.com/BooheeFE/weekly/issues

https://javascript.info/js

原文地址:https://www.cnblogs.com/malq/p/11038406.html

时间: 2024-11-08 23:02:37

再学try-catch的相关文章

编程初步————学渣再学C语言之路

内存: 程序在执行时,程序的指令和数据都必须存储到主内存中,也可以说存在RAM(随机访问存储器)中,RAM是易失性存储器,PC关闭,RAM内容丢失: 变量是什么? 变量就是计算机的一块特定的内存,有一个或多个连续的字节组成,当然每个变量都会有一个名字叫变量名,就像一个ID,一个身份证号码,这个变量名独一无二的代表着这块内存空间,编译器就可以通过这个ID来直接调用这块内存里存储的数据了,这也很好的解释了变量名不占内存空间,编译器直接就把他翻译成了数据: 变量的声明其实也可以称为变量的定义,按照声明

再学C/C++ 之 浅析gdb的-g选项

浅析gdb的-g选项 准备 gdb是Linux下学习C/C++最常用的debug工具.要使用这一强大工具,必须在编译时加上-g选项,生成的目标文件才可以用gdb进行调试. 如,先创建一个test.c文件,内容为: 1 #include <stdio.h> 2 3 int main(void){ 4 int a[2]; 5 a[0] = 1; 6 a[1] = 2; 7 return 0; 8 } 使用编译语句,进行编译: gcc -g test.c -o test.out 浅析-g选项 -g选

C++结构体再学心得

自己定义一个结构体,使用struct关键字 struct student { char name[20]; int age; int num; }; 定义好结构体,student就相当于变量类型,我们可以直接用来定义一个student类型的变量: student A; 也可以直接在定义结构体的时候直接进行定义变量: struct student { char name[20]; int age; int num; }A; 这个结构体可以通过sizeof(student)来获得变量类型所占用的诶村

java之j2se:再学java对象容器

今天是开学第一天,按照上学期的讲课进度,本该是可以开始学习多线程了,但是由于换了老师,可能交接方面有点出入,又给我们讲授了一遍java对象容器,所以这也是为什么题目为"再学". 本文目录: 集合的主要用途 单值类集合:List类与Set类 键值对类集合:Map类 集合的主要用途:集合主要在查询数据返回的时候常用.比如要使用jsp做一个学生信息管理系统,需要从数据库中返回查询学生的结果,把这些结果放入一个集合里,再通过方法返回,在显示层(view)可以使用jsp标签来把他们显示出来. 单

再学Java 之 private、protected、public和default的作用域

前言:如果提到protected的访问控制级别,您的第一反应是"只能是子类才可以访问",那么您很可能需要往下看. 首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:   private default protected public 同一个类中 √ √ √ √ 同一个包中   √ √ √ 子类中     √ √ 全局范围内       √ 在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能

再学Java 之 Integer 包装类缓存

前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static void main(String[] args){ Integer i1 = new Integer(1); Integer i2 = new Integer(1); System.out.println(i1 == i2); Integer i3 = 1; Integer i4 = 1; System.

再学Java 之 foreach循环

从Java 5 之后,Java提供了一种新的循环:foreach循环,这种循环遍历数组和集合更加简洁. foreach循环语法格式如下: for ( type variableName : array | collection){ //variableName自动迭代访问每个元素 } 在很多书籍中,都能找到这么一句话"使用foreach循环迭代数组元素时,并不能改变数组元素".如: String books = {"a","b","c&

再学Java 之 形参个数可变函数

自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]

再学IHanlder 类----------------关于Asp.net与iis原理网上看博客收获写一个验证码用一般处理程序记的好长时间前就写过不过现在再看有点不一样的感觉

建一个web网站 新建一般处理程序直接贴代码: using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.SessionState;using System.Drawing;using System.Text;using System.Drawing.Imaging; namespace HandlerStudy{    /// <summary>    /

【C】 01 - 再学C语言

"C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了".这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有人会回头再仔细看看它.但在现实中却经常会有一些令人抓狂的bug,最终发现竟是语法使用错误造成的,而作者不乏老程序员.仔细想想,其实每个人对C都有些含糊不清的地方,C好像又变得复杂起来.但事实却不是这样,C语言依然是简洁的,它的语法只需几页纸便可讲清.回想起来,其实是我们学得太过匆忙.太过功