当前位置: 首页 > 知识库问答 >
问题:

返回错误和抛出错误之间的差异

屈翰飞
2023-03-14
get(key, store = null) {
    if (!key) {
      return new Error('There is no key to get!');
    }

    let dbstore = this.localforage;

    if (store !== null) {
      dbstore = store;
    }

    return dbstore
      .getItem(key)
      .then(function(value) {
        return value;
      })
      .catch(function(err) {
        return new Error('The key (' + key + ") isn't accessible: " + err);
      });
  }

共有1个答案

阳兴朝
2023-03-14

当您设计一个函数接口,并且有错误需要处理时,您就有了如何返回错误的设计选择。如果函数是同步的,那么您可以返回一些指示错误并容易与实际结果区分的前哨值(在Javascript中通常为null),或者您可以throw异常,或者您可以返回一个具有指示操作成功或失败的属性的对象。

当您使用promise接口进行异步操作时,通常会拒绝promise并使用error对象作为拒绝原因来表示错误。这是promise的核心设计理论。成功通过一个可选值来解决,错误通过一个原因来拒绝。

此代码块:

return dbstore
  .getItem(key)
  .then(function(value) {
    return value;
  })
  .catch(function(err) {
    return new Error('The key (' + key + ") isn't accessible: " + err);
  });

正在用值或error对象解析返回的promise。这通常不是promise代码的编写方式,因为它需要调用方测试解析值的类型,以确定是否存在错误,这不是使用Promission的简单、直接的方法。所以,对于你的问题,你通常会这样做:

return dbstore.getItem(key).catch(function(err) {
    throw new Error('The key (' + key + ") isn't html" target="_blank">accessible: " + err);
});

这个函数中还有其他迹象,说明它只是一个坏代码。

>

  • 。那么(function(value){return value;})是完全多余和不必要的。它没有任何价值。已经是promise的解析值。不用再申报了。

    let retVal = someObj.get(aKey);
    if (typeof retVal === Error) {
        // got some synchronous error
    } else {
        retVal.then(val => {
            if (typeof val === Error) {
                // got some asynchronous error
            } else {
                // got an actual successful value here
            }
        }).catch(err => {
            // got some asynchronous error
        })
    }
    

    函数的实现可能应该是这样的:

    get(key, store = null) {
        if (!key) {
            return Promise.reject(new Error('There is no key to get!'));
        }
    
        let dbstore = store || this.localforage;
    
        return dbstore.getItem(key).catch(function(err) {
            throw new Error('The key (' + key + ") isn't accessible: " + err);
        });
    }
    

    然后可以这样使用:

    someObj.get(aKey).then(val => {
        // got some successful value here
    }).catch(err => {
        // got some error here
    });
    

    将这里的简单性与上面的混乱相比较。

      null

  •  类似资料:
    • 基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par

    • 问题内容: 我正在尝试使用获取Swift中的当前日期。创建断点并停止应用程序时,我发现设备的系统时间相差3个小时。应用程序正在真实的iPhone上运行。如何解决这个问题? 我还确保在App Delegate中编写以下内容: 但这仍然行不通。 问题答案: 它不会返回错误的时间。它返回正确的时间。NSDate没有任何时区信息。现在,当我们调用NSDate()时,我的计算机和您的计算机将报告完全相同的时

    • 问题内容: 我只是使用a 从这样的用户那里获取最新的tweet: 这在我的本地主机上运行良好,但是当我将其上传到服务器时会引发以下错误: 警告: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json)[function.file- get-contents]:无法打开流:HTTP请求失败!HTTP /

    • 我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?

    • 我已经构建了一个使用AJAX提交表单数据的登录脚本。 PHP部分在没有AJAX的情况下运行良好。但是系统不能与AJAX实现一起工作。 它始终显示以下消息,即使 PHP 文件返回 true[正确的用户名 用户名/密码不正确 超文本标记语言Result Div JQuery fn_login.php 有人可以指出代码/实践中的错误吗? 刚刚尝试禁用AJAX,当用户名/密码正确时,PHP文件可以正确回显

    • 因此,我使用服务器(google-app-engine)在客户端应用程序上进行身份验证。当我使用JavaFX、Webview或HttpsURLConnection时,一切都很好,它们连接起来了,但是当我使用HttpClient时,它会抛出以下错误 javax.net.ssl.sslpeerunverifiedexception:peer未在sun.security.ssl.sslsessionim