gpt4 book ai didi

exception - 红旗方法不好吗?

转载 作者:行者123 更新时间:2023-12-02 23:19:43 25 4
gpt4 key购买 nike

在 Squeak 系统浏览器中一些 messages左侧有一面红旗。

我从气球消息中看到,这是因为我的代码出现了中断,即self halt: 'foobar'self error:'foobar'

这有那么糟糕吗?怎样才能避免呢?我把error发生了特别糟糕的事情并且继续下去没有多大意义的消息。比如身份验证失败、从网络获取数据失败等等。

我想做一些事情,比如在这些特定的场合引发异常,但是,如果可能的话,我不想在我的一半方法上看到危险信号。

有标准做法吗?

最佳答案

停止

#halt 是用于调试目的的东西。在大多数情况下,当您想要到达执行流中的某个点并从那里继续使用调试器、单步执行和检查所涉及的对象时,可以插入#halt。您还可以添加 #halt 来查看是否调用某个方法,以便更好地了解计算某些表达式时实际发生的情况。在所有这些情况下,调试完成后应立即删除 #halt

作为一个典型的例子,假设您正在调试一个算法,并且您需要更好地理解它失败的原因。然后插入#halt:

computeDiagonal: k
| product akk diff |
product := self dotProductLimitedTo: k withRow: k.
akk := matrix atRow: k column: k.
diff := akk - product.
diff < 0.0 ifTrue: [
state := #fail.
^self halt]. "wait a minute!"
lower atRow: k column: k put: diff sqrt

断言

但是,在某些情况下,您的调查不够结论性,或者您正在分析的问题无法重现。那么,最好留下一些长期迹象,表明某件事不应该发生,或者如果发生了,提供一个更好地了解其原因的机会。在这些情况下,halt 可以起作用,但可能表达能力不够(您不再沉浸在原始问题中),因此您可能需要考虑 #assert:#deny: 代替。这些消息通常在单元测试中发送,也可以出现在任何方法中,并且会传达更清晰的意图。

请注意,使用 #halt#assert: 的决定并不取决于方法,而是取决于模型的成熟度。例如,如果您不太确定算法不会再次失败,但无法重现失败,则应将 #halt 替换为 assert:#deny:

computeDiagonal: k
| product akk diff |
product := self dotProductLimitedTo: k withRow: k.
akk := matrix atRow: k column: k.
diff := akk - product.
self deny: diff < 0.0. "got you!"
lower atRow: k column: k put: diff sqrt

错误

最后,如果您非常确定应该/不应该发生某些事情,#error:: 是您的最佳选择。 haltassert:error: 之间的区别在于,后者面向最终用户,而其他面向开发人员。

computeDiagonal: k
| product akk diff |
product := self dotProductLimitedTo: k withRow: k.
akk := matrix atRow: k column: k.
diff := akk - product.
diff < 0.0 ifTrue: [self error: 'Cholesky decomposition failed']. "Oh oh..."
lower atRow: k column: k put: diff sqrt

当然,要充分利用Exception框架,您可能需要考虑添加您自己版本的#error:消息,以便它发出信号Exception 的特定子类,而不是通用子类。系统中有大量示例供您获取灵感。这并不总是必要的(或好的),这只是需要考虑的事情。

另请注意,错误可能是可恢复的,因此不要将它们与中止策略相关联。事实上,#halt#assert: 确实发出可恢复异常信号。

结论

调试器是您最好的 friend ,#halt 消息会将其带到代码中的任何位置。但是,在已发布的代码中留下#halt 将被解释为未完成工作的指示。

断言可以帮助其他开发人员更好地理解如何使用您的对象。但请抵制过于自信的诱惑。

错误是一种声明意外行为的优雅方式,可以让开发人员(您)了解可能发生的情况。不要将错误视为文本消息,Smalltalk 中的错误是可能包含有值(value)信息的一流对象。

关于exception - 红旗方法不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57717954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com