gpt4 book ai didi

c# "finally" block ,仅在异常时运行

转载 作者:太空狗 更新时间:2023-10-29 19:48:16 26 4
gpt4 key购买 nike

编辑:我查看了答案代码:NONE 中的代码做我想做的(我已经检查过了)。似乎没有办法在 native c# 中做我想做的事。考虑到 .NET 确实支持它,我想这不是一场灾难,只是一种耻辱(参见已接受的答案)。

谢谢大家。


我有像这样的 C# 代码(测试框架的一部分,除非在调试器下运行,否则永远不会运行)谁指出它是为了避免实际捕获异常,因为这使得在堆栈的展开部分调试代码非常痛苦.

Bool bad = true;
try
{
MightThrow();
bad = false;
}
finally
{
if(bad) DoSomeLoggingOnFailure();

//// Does not catch!!!!
//// exception continues to unwind stack.

//// Note that re throwing the exception is NOT
//// the same as not catching it in the first place
}

他们是更好的方法吗?

A solution would have to behave exactly like that under the debugger with regards to un-caught exceptions. It would have to result in the only one first chance exception and the debugger breaking at the point that the exception was originally thrown, not in a catch block.

Specifically I need the debugger on un-caught exceptions to stop a in side MightThrow.

以下不起作用,因为它无法让调试器在正确的位置中断

try { ... } catch { throw; }

这不起作用,因为它丢失了堆栈信息(并且还在错误的地方中断)。

try { ... } catch(Exception e) { throw e; }

我知道在D我可以使用 scope(failure) block

最佳答案

因此,在 .NET 中,您所要求的在理论上是可行的,但这并不容易。

CIL 实际上定义了五种 类型的异常处理 block !您在 C# 中习惯使用的 trycatchfinally 以及其他两个:

  • filter - 类似于 catch block ,但可以运行任意代码以确定它是否要处理错误,而不仅仅是匹配类型。此 block 可以访问异常对象,并且对异常堆栈跟踪具有与 catch block 相同的效果。

  • fault - 类似于 finally block ,但它仅在发生异常时运行。此 block 无法访问异常对象,并且对异常堆栈跟踪没有影响(就像 finally block 一样)。

filter 在某些 .NET 语言(例如 VB.NET、C++/CLI)中可用,但遗憾的是在 C# 中不可用。但是,除了 CIL 之外,我不知道有任何语言可以表达 fault block 。

因为它可以在 IL 中完成,这意味着不会丢失所有内容。从理论上讲,您可以使用 Reflection.Emit 动态发出具有 fault block 的函数,然后将要运行的代码作为 lambda 表达式传递(即,一个用于 try 部分,一个用于 fault部分,等等),但是 (a) 这并不容易,并且 (b) 我不相信这实际上会给你一个比你现在得到的更有用的堆栈跟踪。

抱歉,答案不是“这里是如何做”之类的东西,但至少现在您知道了!您现在正在做的可能是恕我直言的最佳方法。


请注意那些说问题中使用的方法是“不良做法”的人,事实并非如此。当你实现一个 catch block 时,你是在说“当异常发生时我需要对异常对象做一些事情”,而当你实现一个 finally 时,你是在说“我不需要异常对象,但我需要在函数结束之前做一些事情”。

如果你实际上想说的是“我不需要异常对象,但当异常发生时我需要做一些事情”那么你就介于两者之间,即你想要一个 故障 block 。由于这在 C# 中不可用,因此您没有理想的选择,因此您不妨选择不太可能因忘记重新抛出而导致错误且不会破坏堆栈跟踪的选项。

关于c# "finally" block ,仅在异常时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533968/

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