【问题标题】:Throw object instead of returning string抛出对象而不是返回字符串
【发布时间】:2018-05-14 08:29:14
【问题描述】:

如何构建一个错误对象而不是给它一个字符串? https://codesandbox.io/s/pwr973487x

async function getUrl()  {
  try {

    const res = await axios.get('https://httpstat.us/500')
  } catch(e) {
    const errorObj = {
      status: 500,
      message: 'Internal server error, something is not defined etc'
    }
    throw new Error('err') //how to build object?
  }
}

我希望throw Error() 返回errorObj。我是否必须自己上课才能做到这一点,或者我可以为此修改现有的 Error 类?我需要它,以便标准化我的不同 API 集的错误消息。

【问题讨论】:

  • 你可以扔errorObj...? - 还有,你为什么要扔进一个球里?
  • @为什么不抓住机会?
  • ¯\_(ツ)_/¯ - 我通常不会,除非我希望在其他地方捕获错误......但你绝对可以只抛出一个普通对象而不扩展 Error 对象。

标签: javascript reactjs ecmascript-6 axios


【解决方案1】:

你可以使用从catch返回的错误对象

  try {
    const res = await axios.get('https://httpstat.us/500')
  } catch(e) {
    e.message = 'Internal server error, something is not defined etc';
    throw e;
  }

【讨论】:

    【解决方案2】:

    您可以在错误对象中添加一个字段,例如

    var err = new Error('Internal Server error');
    err.customField = { someProperty: 'some value'};
    
    console.log(err);
    

    然后你就可以正常扔了:

    throw err;
    

    当您发现错误时(在调用堆栈中较高),您可以拉出自定义字段:

    try
    {
        throw err;
    }
    catch (e)
    {
       console.error(e);
       console.log(e.customField);
    }
    

    从 ES6 开始,您还可以创建自己的错误类:

    class MyError extends Error {
    
        constructor(message, customValue) {
            super(message);
            this.field = customValue;
        }
    
        get customField() {
            return this.field;
        }
    
        set customField(obj) {
            this.field = obj;
        }
    };
    
    var ex = new MyError('Error message', {someProperty: 'some value'});
    console.dir(ex);
    console.log('My custom error details: ', ex.customField);
    

    【讨论】:

    • 您也可以使用console.warn('something')console.error('something') 让它们在浏览器控制台中看起来不同。
    • 当人们可以抛出他们喜欢的任何对象时,扩展 Error 对象的偏好是什么。
    • 好点,@evolutionxbox,您可以采用这种方法。我不确定所有浏览器都可以很好地使用这种模式,例如如何在控制台等中报告它。我个人觉得扩展错误对象更舒服。
    • 另外,你会得到任何对象的堆栈跟踪吗?
    【解决方案3】:

    你可以试试the cause propoty of :

    TS目前关于它的值类型不准确,this is being discussed on the official to revolve it

    try {
         throw new Error('Failed in some way', { 
           cause: {status: 400} 
         });
    } catch(e) {
         console.log(e); // Error('Failed in some way')
         console.log(e.cause) // {status: 400} 
    }
    

    或使用自定义属性抛出 Error 实例

    try {
         const error = new Error('Failed in some way');
         error.status = 400;
         throw error;
       } catch(e) {
         console.log(e); // Error('Failed in some way')
         console.log(e.status) // 400
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 2011-07-29
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多