新的 Iterable<Future>.wait
和 Record<Future, ...>.wait
扩展真的很棒,尤其是记录,允许你在等待同时解析不同类型时保持类型安全。
然而,它们不能在 Flutter 工具的一些实现中使用,因为工具的错误处理不考虑等待它们的 ParallelWaitError
可能抛出的异常。
我期望/希望这些方法最终完全取代 Future.wait
,所以为工具的错误处理添加支持会很好。
新的 Iterable<Future>.wait
和 Record<Future, ...>.wait
扩展真的很棒,尤其是记录,允许你在等待同时解析不同类型时保持类型安全。
然而,它们不能在 Flutter 工具的一些实现中使用,因为工具的错误处理不考虑等待它们的 ParallelWaitError
可能抛出的异常。
我期望/希望这些方法最终完全取代 Future.wait
,所以为工具的错误处理添加支持会很好。
6条答案
按热度按时间tquggr8v1#
新的
Iterable<Future>.wait
和Record<Future, ...>.wait
扩展真的很棒,尤其是记录,允许你在等待同时解析不同类型时保持类型安全。我以前没有听说过这些,但它们确实看起来非常有用!
然而,它们不能在工具的实现中使用,因为工具的错误处理不考虑等待它们的
ParallelWaitError
可能抛出的异常。你能详细解释一下吗?这里的预期行为是什么,而你实际看到的行为是什么?
bhmjp9jg2#
你能详细解释一下吗?这里的预期行为是什么,你看到的实际情况是什么?
抱歉没有说得太具体。当运行一个提供的命令时,工具有错误处理机制来显示任何潜在的错误并以不同的方式适应它们,例如
ToolExit
不会导致崩溃报告。如果
ToolExit
是由await (functionThatThrowsToolExit(), functionThatThrowsToolExit()).wait)
产生的,命令运行器只会看到 Package 它的ParallelWaitError
并将其传递给用户(以及可能的崩溃报告器?)。r6l8ljro3#
好的,现在我明白了。谢谢!
我认为增强
_handleToolError
以处理ParallelWaitError
是合理的。由于errors
列表可能包含ToolExit
s 和非ToolExit
s 的任何组合,因此具体应该如何操作并不明显。特别是有几个需要处理的情况:ToolExit
s 的情况,ToolExit
s 的情况,以及ToolExit
s 和非ToolExit
s 的某种组合的情况。情况1主要是弄清楚我们应该向用户显示什么,这应该不会太难。
对于情况2,我认为我们可以让
ParallelWaitError
顺利执行。堆栈跟踪将是第一个错误的堆栈跟踪,这将是足够的信息来对崩溃进行分类。这里的缺点是第一个错误实际上会隐藏其他错误。然而,我不认为这是一个严重的问题,除非多个非ToolExit
错误总是一起发生。更有可能的是(在这个不太可能的情景中),这只会导致一些错误被低报,我认为这是可以接受的。情况3可能是最棘手的。我们不能依赖
ParallelWaitError::stackTrace
的默认行为,因为那堆栈跟踪可能是来自一个ToolExit
的,而它不应该被包含在崩溃报告中。一个想法是简单地throw
第一个非ToolExit
。或者,对于情况2和3,我们可以为每个非
ToolExit
发送崩溃报告,然后仅使用第一个错误创建崩溃日志和我们向用户显示的链接。这样我们就不会有一项错误掩盖其他错误的风险。这些只是一些想法。我很乐意在解决此问题的任何PR中进一步讨论和思考这个问题。
脚注
ParallelWaitError<List<num?>, List<AsyncError?>>: ParallelWaitError: Null check operator used on a null value
↩yi0zb3m44#
顺便说一下,如果我们之前使用了
Future.wait
,那么我们已经处理了上述情况。也就是说,我们当然不应该让工具崩溃,但我认为我们可以只显示第一个ToolExit
(如果有的话),如果没有,则显示所有错误。我们可以做得更好,但这将是严格优于Future.wait
的改进,而不是功能对等。wfsdck305#
顺便说一下,如果我们之前使用的是
Future.wait
,那么我们已经处理了上述情况。也就是说,我们当然不应该让工具崩溃,但我认为我们可以只显示第一个ToolExit
(如果有的话),如果没有,显示所有的错误。我们可以做得更好,但这将是对Future.wait
的严格改进,而不是功能对等。Future.wait
具有不同的语义,我相信它会急切地与第一个错误一起完成,而(futureA, futureB).wait
会收集所有错误,然后将它们 Package 在一个新的类型ParallelWaitError
中。oug3syen6#
根据我所知,只有在设置了
eager: true
的情况下,它才会积极地完成,对吗?否则,它只是恰好没有显示其他错误。