Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理非致命错误条件_C#_Error Handling - Fatal编程技术网

C# 如何处理非致命错误条件

C# 如何处理非致命错误条件,c#,error-handling,C#,Error Handling,我不确定这是否是一个重复,但如果是,请随时关闭此 背景: 我为我正在编写的游戏提供了一个计时器组件,它支持停止和暂停方法。讨论中的非关键错误情况是在计时器中已暂停时调用Pause,这不是致命的,但不会导致方法名称所隐含的状态变化 问题: 1.通常如何表示非致命但异常的情况? 2.在这些情况下,我真的应该抛出一个异常吗?考虑到暂停时调用暂停不会造成任何伤害,我认为这有点过于严厉 3.我是不是想得太多了 更新: 根据回复和评论,我选择了以下国家: 在开发构建中,会发生异常,因为我考虑这些错误,我想捕

我不确定这是否是一个重复,但如果是,请随时关闭此

背景: 我为我正在编写的游戏提供了一个计时器组件,它支持停止和暂停方法。讨论中的非关键错误情况是在计时器中已暂停时调用Pause,这不是致命的,但不会导致方法名称所隐含的状态变化

问题:
1.通常如何表示非致命但异常的情况?
2.在这些情况下,我真的应该抛出一个异常吗?考虑到暂停时调用暂停不会造成任何伤害,我认为这有点过于严厉
3.我是不是想得太多了

更新:
根据回复和评论,我选择了以下国家: 在开发构建中,会发生异常,因为我考虑这些错误,我想捕获它们并改正它们。我不能证明在发布版本中出现异常是合理的,因为这些bug不会破坏游戏状态,而且我不认为应用程序的用户会因为我没有正确编码而感激他们辛苦赢得的分数的损失


感谢您的回复,这对我很有教育意义。

如果计时器已经暂停,您可以忽略呼叫。假设方法名为Pause(),那么客户端只需要在方法调用后暂停计时器,并且只有在不暂停的情况下才会抛出异常;该方法并不意味着对计时器的当前状态有任何要求


另一方面,如果该方法被称为ChangeTimerFromRunningToPaused(),则这意味着仅在运行的计时器上调用该方法是有效的。在这种情况下,我希望它抛出一个异常,通知客户端计时器未处于处理此方法调用的有效状态。

在这种情况下(将某个状态机移动到它已经处于的状态),我将跳过调用。通常,非致命错误或警告不应作为异常抛出,而应作为结果返回(可以忽略或处理,只要最适合情况)。

不,不要抛出异常,异常非常严重。再次停顿没有什么不对的。我看不出有什么坏处。如果是我的代码执行第二个<代码> PAUSER()/Cudio>调用,那么如果我的代码在不应该调用的情况下调用,我可能会认为我的代码被破坏了。也许我错过了一个类似
if(Timer.IsRunning){}
的检查,我不想通过默默地忽略调用来隐藏这个bug。即使调用是由用户输入触发的(例如单击按钮),这也可能表明设计不好,我应该看看它。也许这个按钮应该被禁用

我想得越多,就越不会想到第二个调用不应该是表示错误调用代码的异常的情况。所以,是的,我会抛出异常

更新

在一篇评论中,Martin Harris建议在开发过程中使用
Debug.Assert()
来获取bug。我认为这太弱了,因为在生产代码中不会出现bug。但您当然不想因为这个非致命错误而使生产中的应用程序崩溃。因此,我们将在堆栈中捕获此异常并生成一个错误报告,然后像什么都没有发生一样继续

这里有两个很好的链接



这看起来很相似(虽然不完全相同),也许这里的答案对你有帮助

只是一个想法:例如,卡塞特球员暂停是一个切换按钮。换言之,再次按下它将再次启动:)@Svish我认为这不起作用。。。至少您必须重命名该方法。(当它们切换时,通常会标记为“播放/暂停”)这可能会使bug更容易被注意到;P但可能一个异常也会这样做。在这种情况下,我会使用Debug.Assert(Timer.IsRunning)。因为我认为既然调用不是致命的(也不是例外),但可能不是最优的,在调试时了解它可能会有所帮助。我甚至会添加一个重载,以允许调用方明确指定它是否重要。完全同意这可能是某种错误的迹象。但像大多数迹象一样,也有例外。。。就像试图通过超敏感的比赛条件应急计划来避免膨胀。在一些情况下,过载版本可能是好的。但是如果我必须经常使用重载,我会开始考虑将其重构为pauseTimerFrunning(),并将检查移到方法中。我认为Debug.Assert()太弱了,因为如果代码在生产环境中,它就不会出现错误。但我会更新答案来澄清这一点。这是一个比我原来认为的更有趣的问题。我猜答案是“您的代码的客户机希望发生什么?”如果我是客户机,那么我希望调用会被忽略——毕竟我只对调用结束时暂停感兴趣。Daniel希望它抛出一个异常——毕竟它实际上没有执行他期望的操作,而Svish(在问题评论中)希望它重新启动——毕竟他的tapedeck就是这样工作的。因此,如果代码不是一个公共库,只需按照您的期望执行即可+谢谢你让我思考。