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. 确保对异常情况进行处理,避免对异常的忽略。
  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7367457.html
Copyright © 2011-2022 走看看