zoukankan      html  css  js  c++  java
  • Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常

    异常处理是异步编程的一个难点。

    在同步的代码中,异常可以非常easy地通过try catch语句来完毕:

    try {
        f();
        g();
        h();
    } catch (e) {
        // handle any error that occurred...
    }

    可是在异步代码中,使用一个try代码块将全部可能出现的异常都包含在内是不现实的。实际上,异步API设置不能抛出异常。由于当异常发生时,通常已经没有运行上下文供它抛出了。

    全部,在异步API中一般会使用特殊的參数或者错误回调函数来表示异常信息。比方。在Item 61中提到的下载文件的异常处理能够例如以下进行:

    downloadAsync("http://example.com/file.txt", function(text) {
        console.log("File contents: " + text);
    }, function(error) {
        console.log("Error: " + error);
    });

    可见downloadAsync方法不仅接受了一个作为成功返回响应时的回调函数。同一时候还接受了一个异常回调函数。那么以此类推,在下载多个文件时的异常处理是这种:

    downloadAsync("a.txt", function(a) {
        downloadAsync("b.txt", function(b) {
            downloadAsync("c.txt", function(c) {
                console.log("Contents: " + a + b + c);
            }, function(error) {
                console.log("Error: " + error);
            });
        }, function(error) { // repeated error-handling logic
            console.log("Error: " + error);
        });
    }, function(error) { // repeated error-handling logic
        console.log("Error: " + error);
    });

    第一眼看上去。上述代码有些乱。所以我们能够考虑使用命名回调函数的方式将错误处理抽取出来:

    function onError(error) {
        console.log("Error: " + error);
    }
    
    downloadAsync("a.txt", function(a) {
        downloadAsync("b.txt", function(b) {
            downloadAsync("c.txt", function(c) {
                console.log("Contents: " + a + b + c);
            }, onError);
        }, onError);
    }, onError);

    在Node.js中。另一种异常处理API的风格。它会将错误信息作为回调函数的第一个參数。假设没有错误发生,那么该參数的值是null,undefine之类的falsy值。使用这样的方式进行异常处理例如以下所看到的:

    function onError(error) {
        console.log("Error: " + error);
    }
    
    downloadAsync("a.txt", function(error, a) {
        if (error) {
            onError(error);
            return;
        }
        downloadAsync("b.txt", function(error, b) {
            // duplicated error-checking logic
            if (error) {
                onError(error);
                return;
            }
            downloadAsync(url3, function(error, c) {
                // duplicated error-checking logic
                if (error) {
                    onError(error);
                    return;
                }
                console.log("Contents: " + a + b + c);
            });
        });
    });

    为了添加代码的可读性。非常多开发者会省略用于推断是否须要异常处理的if语句块的大括号:

    function onError(error) {
        console.log("Error: " + error);
    }
    
    downloadAsync("a.txt", function(error, a) {
        if (error) return onError(error);
        downloadAsync("b.txt", function(error, b) {
            if (error) return onError(error);
            downloadAsync(url3, function(error, c) {
                if (error) return onError(error);
                console.log("Contents: " + a + b + c);
            });
        });
    });

    在使用异步API时。忘记对异常进行处理是常常犯的错误。这会让异常信息被忽略掉,从而导致比較糟糕的用户体验。所以在使用异步API时,切记对异常情况进行处理。我想这也是为何在Node.js中,异常信息会被当做回调函数的第一个參数,让开发者不得不面对它。

    总结

    1. 避免对异常处理代码进行复制粘贴,将它作为共享的函数是更好的选择。
    2. 确保对异常情况进行处理,避免对异常的忽略。
  • 相关阅读:
    CentOS下添加sudo用户
    CentOS查看你是否有USB 3.0端口
    CentOS查看操作系统信息(重要)
    JStack分析cpu消耗过高问题
    Java内存管理和垃圾回收
    kafka学习之-深入研究原理
    kafka学习之-文件存储机制
    kafka学习之-配置详解
    Hbase学习之javaApI封装
    linux中top命令
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7367457.html
Copyright © 2011-2022 走看看