我不确定这是否重复,但如果是,请随时关闭。
背景: 我有一个计时器组件用于我正在编写的支持Stop和Pause方法的游戏。有问题的非严重错误案例就是在定时器暂停时调用Pause,这不是致命的,但它不会导致方法名称隐含的状态改变
问题:
1.人们通常如何表示非致命但异常的情况?
2.在这些情况下,我真的应该抛出异常吗?考虑到停顿暂停时不会造成任何伤害,我认为这有点严厉
我是在过度思考这个
更新:
根据回复和评论,这里是我选择采取的策略:
在开发构建中会发生异常,因为我考虑了这些错误,我想抓住它们并纠正它们。我无法证明发布版本中的异常是正确的,因为这些错误不会破坏游戏状态,我不认为应用程序的用户会因为我无法正确编码而失去他们难以获得的分数
感谢您的所有回复,这对我来说非常有教育意义。
答案 0 :(得分:7)
如果计时器已经暂停,我认为你可以忽略通话。假设该方法被称为Pause(),那么客户端只需要在方法调用之后暂停计时器,并且只有在不存在时才抛出异常;该方法并不意味着对计时器的当前状态有任何要求。
另一方面,如果该方法名为ChangeTimerFromRunningToPaused(),那么这意味着只有在正在运行的计时器上调用它才有效。在这些情况下,我希望它会抛出异常,通知客户端计时器未处于有效状态以处理此方法调用。
答案 1 :(得分:3)
对于其他答案,我会考虑抛出异常。如果我的代码执行第二次Pause()
调用,我可能会认为我的代码在不应该调用的情况下被破坏。也许我错过了像if (Timer.IsRunning) { }
这样的支票,我不想通过默默地忽略这个电话来隐藏这个错误。即使呼叫是由用户输入触发的 - 例如按钮点击 - 这可能表明设计不好,我应该看看它。也许该按钮应该被禁用。
我想的越多,脑海中浮现的情况就越少,第二次调用不应该是表示调用错误代码的异常。所以,是的,我会抛出异常。
<强>更新强>
在评论中,Martin Harris建议在开发期间使用Debug.Assert()
来获取错误。我认为这是弱的,因为你不会在生产代码中得到错误。但是当然,由于这种非致命错误,您不希望在生产中使应用程序崩溃。因此,我们将在堆栈中捕获此异常并生成错误报告,然后恢复,就像没有任何事情发生一样。
这是两个粘性链接。
API Design Myth: Exceptions are for "Exceptional Errors"
Coding Horror - Exception-Driven Development
答案 2 :(得分:1)
在这种情况下(将一些状态机移动到它已经存在的状态),我只是跳过这个呼叫。通常,非致命错误或警告不应该作为异常抛出,而是作为结果返回(可以忽略或处理,无论最适合的情况)。
答案 3 :(得分:1)
不,不要抛出异常,异常很重。再次停顿没什么不对。我没有看到任何伤害。
答案 4 :(得分:0)
这与one of my questions看起来相似(虽然不完全相同),也许这些答案对你有帮助。