解码Dart中的捕获响应

时间:2019-02-11 16:45:29

标签: dart

我尝试解码从捕获返回的响应,这是我尝试过的:

console.log('==============STREET REPORT==============')

// key = 'amesSt', value = 500
const streetLengths = new Map();
streetLengths.set('amesSt', 500);
streetLengths.set('bentonSt', 1200);
streetLengths.set('chaseSt', 750);
streetLengths.set('depewSt', 200);

console.log(streetLengths);

// classify streets
    function streetClass(key, value) {

    if (value < 250) {
        console.log(`${key} Street is classified as small`);
    } else if (value >= 250 && value < 600) {
        console.log(`${key} Street is classified as normal`);
    } else if (value >= 600 && value < 1000) {
        console.log(`${key} Street is classified as big`);
    } else if (value >= 1000){
        console.log(`${key} Street is classified as huge`);
    } else{
        console.log('Normal');
    };  
};

console.log('Size classification:');

//key = 500, value = 'amesSt'
streetLengths.forEach((key, value) => {

    streetClass(key, value);
});
  

错误:类型'_Exception'不是类型'字符串'的子类型

print(err):

  

例外:{              “错误”:{                  “代码”:“ invalid_expiry_year”              }           }

我想获取“代码”的值,我尝试了很多事情,但是没有用,

有什么主意吗?

try{
  ...
} catch (err) {
    //JsonCodec codec = new JsonCodec(); // doesn't work
    //var decoded = codec.decode(err);
    ...
 }

然后我得到:

enter image description here

2 个答案:

答案 0 :(得分:0)

我终于找到了解决方案:

catch (response) {
    var err=response.toString().replaceAll('Exception: ', '');
   final json=JSON.jsonDecode(err);
   print(json['error']['code']);
}

答案 1 :(得分:0)

可以获得message属性并jsonDecode

try {
} catch (e) {
  var message = e.message; // not guaranteed to work if the caught exception isn't an _Exception instance
  var decoded = jsonDecode(message);
  print(decoded['error']['code'])'
}

所有这些都是滥用Exception的结果。请注意,您通常不想想要throw Exception(message);。将json编码的消息放入其中并不是传达有关异常的详细信息的最佳方法。而是编写Exception的自定义实现并捕获特定类型。

class InvalidDataException implements Exception {
  final String code;
  InvalidDataException(this.code);
}

try {
} on InvalidDataException catch(e) {
  print(e.code); // guaranteed to work, we know the type of the exception
}

请参见docs for Exception

  

不建议直接使用new Exception("message")创建Exception实例,并且仅在开发过程中将其作为临时措施,直到完成库使用的实际异常为止。

另请参阅https://www.dartlang.org/guides/language/effective-dart/usage#avoid-catches-without-on-clauses