1. 异常时的调用栈信息
我们都知道当代码抛出异常时,会在控制台输出异常信息,从中可以看到异常发生时 函数调用栈 详情。这些信息可以帮助开发者快速定位到异常发生的位置,并且具体到 文件第几行,第几个字符。
比如这里是初始的计数器项目,我在 _incrementCounter
方法开始时写了一行异常的代码。这样在运行时点击加号按钮触发方法,就会出现如上的异常信息。
当函数因异常而终止时,其下方的代码将无法执行。
也就是说,此时点击按钮,由于下面的 setState 没有触发,界面上的数值不会变化。但如果把这行异常的语句放在后面,虽然会报错,但不会影响计数器的功能:
2. 捕捉异常时的调用栈信息
通过 try catch 代码块可以捕捉异常,这样异常的代码就 不会影响 后续代码的执行。
此时通过 print 打印异常,只能得到如下所示的异常信息:那该如何查看异常时的函数调用栈信息呢?
其实 catch 代码块除了异常对象,还可以通过第二参回调函数调用栈信息:
此时通过打印,就可以得到如下的信息:
可以使用调试来查看一下这个 stack 的运行时类型。如下所示,类型为 _StackTrace
:
3. 如何捕捉任意位置调用栈信息
除了异常捕捉外,有办法在任意代码位置,获得当前函数调用栈信息吗?比如记录一些日志时,一个事件的触发点可能有很多地方,如果能知道当前的调用栈信息,那么对问题的排查将大有裨益。
通过
StackTrace.current
可以获取当前代码位置的调用栈信息
可能有些朋友看到下面的内容就会有一些不悦,毕竟它一般代表着代码出现异常了。不过注意此时,这个函数调用栈信息不是
异常抛出的,而是我们主动获取 的。
另外,仔细观察一下这个调用栈信息,我们似乎可以从中一步步看到点击事件在源码中时如何实现的。信息就是有价值的,不要惧怕信息,要从中汲取到对我们有帮助的内容,它的存在是帮助我们解决问题。
尾声
本文介绍了一个非常小的知识点,但它的价值是非常大的。函数调用栈信息,可以帮我们快速定位问题所在,也能反应出一个函数被调用的全过程,也利于源码分析。那么本文就到这里,更多 Flutter 知识集锦内容,敬请期待 ~
更多文章和视频知识资讯,大家可以关注我的公众号、掘金和 B 站 。