Flutter:当抛出异常时如何获取完整的堆栈跟踪?

4

我建立了一个应用程序,使用了一些try-catch。问题是每当我打印出异常时,它只会打印出异常的第一行。例如,当我删除所有的try-catch并抛出异常时,它会显示如下:

E/flutter (15478): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
E/flutter (15478): #0      MyClass._insertIntoDB (package:test/util/my_class.dart:186:25)
E/flutter (15478): <asynchronous suspension>
E/flutter (15478): #1      MyClass.download(package:test/util/my_class.dart:62:11)
E/flutter (15478): <asynchronous suspension>
E/flutter (15478): #2      blabla.asaa(package:test/sync.dart:94:9)
E/flutter (15478): <asynchronous suspension>
E/flutter (15478): #3      tata.dodo(package:test/my_screen.dart:91:11)
E/flutter (15478): <asynchronous suspension>
E/flutter (15478): 

每当出现这种情况时,我就能看到问题发生的位置:MyClass._insertIntoDB (package:test/util/my_class.dart:186:25) <--

但是,当我将给定代码放在try-catch之间时,我只会收到以下信息:

E/flutter (15478): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value

该消息表明了问题所在,但没有说出具体位置...

这是第一次处理异常的地方:

 try {
      List<MyDto> dtoList = dtoFromJson(body);
      if (dtoList.isNotEmpty) {
        for (var i in dtoList) {
          await _insertIntoDB(i, db);
        }
      }
    } catch (error) {
      throw Exception(
          "Problem while JSON decoding results. [error=${error.toString()}]");
    }

这里的错误等于:[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value

所以我得到了这个错误:"Problem while JSON decoding results. [error=[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value]"

所以实际有用的信息,即异常抛出的位置(文件中的哪一行)未显示...是否可能包含剩余的堆栈跟踪信息?

请注意,我并没有问为什么会引发异常!(这不是我不包括 insertIntoDb 代码的原因)。

提前致谢。

1个回答

9

catch的第二个参数是stackTrace

try {
  List<MyDto> dtoList = dtoFromJson(body);
  if (dtoList.isNotEmpty) {
    for (var i in dtoList) {
      await _insertIntoDB(i, db);
    }
  }
} catch (error, stack) {
  print(stack);
  throw Exception(
      "Problem while JSON decoding results. [error=${error.toString()}]");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接