JavaScript的调试技能

在处理JavaScript错误时,都有哪些工具和手段可以使用。

==================================================
try...catch...finally
错误类型
RangeError: 数值超出对应的范围。
ReferenceError: 找不到对象时会发生的错误(对象未定义就使用)。
SyntaxError: 语法错误
TypeError:类型错误(所调用的方法是对象所不具备的,你实际的对象类型不是期望的对象类型)
URIError:uri格式不正确
==================================================
function error() {
var x = 0;
var y = 1;
try {
var z = y / x;
return 1;
} catch(error) {
console.log(error.message);
return 2;
} finally {
console.log(y + " / " + x  + " = "  + z);
return 3;
}
}
console.log(error());
/*
只要代码中包含finally,无论try或者catch中包含什么代码,
哪怕是reutrn,都将会被忽略。而直接执行finally。为什么?
finally也就是说无论如何都会执行的代码块。可是如果在try
或者catch中执行了return,那么程序到此结束。return的执行
意味着函数调用的结束。所以,为了服从finally的最高优先级,
必须牺牲try和catch。
*/
=====================================================
将错误类型和try...catch...finally结合起来,对每一种错误类型进行处理。
try {
...
} catch(error) {
if (error instanceof TypeError) {
...
console.log("TypeError");
} else if (error instanceof ReferenceError) {
...
console.log("ReferenceError");
} else if (error instanceof SyntaxError) {
...
console.log("SyntaxError");
} else if (error instanceof RangeError) {
...
console.log("RangeError");
} else {
...
console.log("Error");
}
} finally() {
...
}
========================================================================
抛出错误
一般如果不自定义,那么程序中存在的错误是浏览器默认的错误,但是各个浏览器
抛出的错误都是模糊的而且是不一致。浏览器抛出的错误只能告诉你哪里出现了错误,
以及通过错误类型提醒你这个错误大致属于那个范围的错误。提示的精度到此为止,
如果要想具体的知道这个错误到底是什么错误,可以迫使浏览器抛出自己定义的错误。
既然这个异常信息是自己定义的,那么你一定知道错误出现在哪里。因此,一旦抛出错误,
你能够在第一时间定位错误,确定错误,然后进行处理。
=====================重要的话说三遍=====================================
捕获错误的目的是避免浏览器抛出默认的模糊错误。
抛出错误的目的是明确提供错误出现的具体原因。
因此只抛出哪些你明确知道在哪里会发生的错误。
也只捕获哪些你确切地知道该如何处理的错误。
========================================================================
捕获错误的目的是避免浏览器抛出默认的模糊错误。
抛出错误的目的是明确提供错误出现的具体原因。
因此只抛出哪些你明确知道在哪里会发生的错误。
也只捕获哪些你确切地知道该如何处理的错误。
========================================================================
捕获错误的目的是避免浏览器抛出默认的模糊错误。
抛出错误的目的是明确提供错误出现的具体原因。
因此只抛出哪些你明确知道在哪里会发生的错误。
也只捕获哪些你确切地知道该如何处理的错误。
=========================================================================
数据类型错误
调用函数时,对传递进来的参数首先必须进行类型检测,
期望收到的是数组就对数组进行检测
期望收到的是对象就对对象进行检测
尤其是if中的类型检测
<html>
<head>
    <script>
        function ArrayLimit(array) {
            if (! (array instanceof Array)) {
                throw TypeError("传递的参数array必须是数组类型!");
            }
            for (var i = 0; i < array.length; i++) {
                console.log(array[i]);
            }
        }
        var list1 = [1, 2, 3, 4, 5, 6, 7, 8 ,9];
        var object = {'place': 'wuahn', 'location': 'china'};
        ArrayLimit(object);
    </script>
</head>
<body>
</body>
</html>
=========================================================================
思路:代码什么时候抛出错误,这个错误发生的原因是什么。另外就是去监控追踪这个错误。
=========================================================================
类型转换错误
/*
JavaScript是松散类型语言,一个数据的类型完全可以在
代码执行的过程中进行转换。但是这个转换有时不容易发觉
比如,你需要比较一个数是否是123,如果是,执行操作。
但是,问题是你很可能传递了一个字符串"123",但是解释器
自动将"123"解释成123。这个也许不大常见,最常见的就是
在if()中进行boolean条件判断时,出错的概率要大很多。
尽量不要使用默认的类型转换规则,而是用自己强制的检查。
最佳实践:使用全等===不使用==,使用!==不使用!=
使用typeof检查基本类型,使用instanceof检查引用类型。
*/
function checkType(val) {
if (val === 123) {
console.log(val);
}
}
checkType("123");
==============================================================================
额外的技巧:
将错误信息输出到页面上特定的区域
<html>
<head>
    <script>
        function showError(message) {
            var elem = document.getElementById('debug');
            if (elem === null || elem === undefined) {
                elem = document.createElement('span');
                elem.id = "debug";
            }
            elem.style.background = 'blue';
            elem.innerHTML = message;
        }
        function ArrayLimit(array) {
            if (! (array instanceof Array)) {
                showError("传递的参数array必须是数组类型!");
                //throw TypeError("传递的参数array必须是数组类型!");
            }
            for (var i = 0; i < array.length; i++) {
                console.log(array[i]);
            }
        }
        function sendArray() {
            var list1 = [1, 2, 3, 4, 5, 6, 7, 8 ,9];
            var object = {'place': 'wuahn', 'location': 'china'};
            ArrayLimit(object);
        }
    </script>
</head>
<body>
    <span id="debug">
    </span><br>
    <lable for="send">emit</lable>
    <input type="button" onclick="sendArray()" name="send"/>
</body>
</html>
===================================================================
错误的原因:
类型转换
数据类型
发送给服务器或者从服务器接收的数据存在错误。
===================================================================

猜你喜欢

转载自blog.csdn.net/qq_23143555/article/details/80874049