通常不赞成使用System.Exception,但我想知道这是否是我唯一的选择。
我有这个场景
因此,如果在步骤1到4之间发生任何事情,任务仍然很好,因为它没有被锁定。但是,如果它在步骤5中失败并且我无法向用户显示该任务,则该文件将被锁定并将被锁定,直到计划的作业运行以确保锁定为long的文件被强制解锁。
有点不理想,因为它可能是一些暂时的失败,下次他们请求文件时它可以再次工作。但是现在他们必须等待(与所有其他订户一样)X分钟,直到它自动解锁。
所以我的第一个想法就是使用了一个finally语句,但无论如何我总是无法运行,所以我无法弄清楚如何说好文件现在已锁定,不用打扰它。
或者文件被锁定但是出错了解锁它。如果C#有一个只在发生异常时运行的语句,那就太好了。
所以我唯一的另一个想法就是有一个例外,如果发生任何事情,它会在那里解锁它。唯一不会出现的情况是它是否是一个SQl异常,因为如果数据库关闭,没有必要尝试解锁一些东西。
当然,我会使用elmah记录错误,然后慢慢添加更好的异常类型。
那么有没有人有更好的想法?
答案 0 :(得分:4)
不要让完美成为善的敌人。在这种情况下捕获一般异常是完全正常的。如果您可以捕获并从更具体的异常类型中恢复,请执行此操作。但拥有一切 - 刚刚去地狱的恢复计划不仅可以,而且值得称赞。
答案 1 :(得分:2)
如果它是线程的顶部,并且您不希望程序在任何情况下崩溃,则可以接受捕获System.Exception
。一般来说,捕获System.Exception
是一个坏主意,因为你应该知道可能会发生什么样的错误,这样当发生一些完全意外的事情时,它会冒泡到你捕获的线程的顶部{{1并且可能提供堆栈跟踪信息等用于调试目的。
在您的情况下,由于您担心在处理时区转换的第5步中发生“不良”事件,您可以尝试预测哪些特定异常或异常类别可能会触发,并特别捕获这些异常或类别,处理适当解锁。
或者,既然您显然能够创建找到锁定文件并有效强制解锁的所述计划任务,那么您不能在finally块中使用相同的逻辑吗?例如如果它被锁定,解锁它,否则,noop。