【发布时间】:2023-03-03 07:31:19
【问题描述】:
为了简化我的 try 块,我创建了一个静态函数来处理错误捕获,因为无论如何我已经在所有方法中以相同的方式捕获错误。
static class Exceptional
{
public static Exception Try(Action action, [CallerMemberName] string cmn = "")
{
try
{
action();
return null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace, cmn + ": " + ex.GetType().Name);
return ex;
}
}
}
然后我已经替换了所有情况
try
{
...
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace);
}
与
Exceptional.Try(() =>
{
...
});
这不仅简化了将我的代码包装在 try 块中的过程,而且还为我提供了一个集中的地方来全局更改我处理异常的方式。
我知道捕获所有异常并一视同仁地对待它们并不是一个好习惯。我知道我应该只捕获我期望抛出的异常类型,但现在我只是在测试东西,我不知道会抛出什么,所以我一直在使用try块以确保我不会出现无声或无法解释的故障。这不是我的问题所在。
我想知道这样做是否有改变代码行为的危险。显然调用堆栈正在通过向其中插入一个附加函数而被更改,但是这个额外的函数可能会导致意想不到的问题吗?欢迎批评!谢谢。
编辑:我应该提到我目前正在将整个方法体包装在我的 Exceptional.Try 调用中,所以我特别想知道在这种情况下我是否会遇到奇怪的行为,而不是 lambda 表达式之外的东西可能导致奇怪的行为。
【问题讨论】:
-
“我一直在使用
try块来确保我不会出现静默失败” - 什么???如果您根本不使用异常处理,那么您会看到异常 - 使用try块允许静默失败。您应该只捕获可以从中恢复并且可以有意义地处理的异常。你几乎不应该这样做catch (Exception)。 -
好的。我有时会遇到无声的失败。如果您打开异常设置,您可以选择它中断的异常,所以这可能与它有关。但无论如何,无声的失败并不是唯一的问题。我还想控制我从异常中获得的信息。
-
哦,你知道发生了什么吗?这本身并不是无声的失败,但程序只是崩溃而没有说明原因。
-
您可以放置应用程序级别的异常来捕获所有内容。到处放
try块只是浪费你的时间。阅读以下内容:blogs.msdn.microsoft.com/ericlippert/2008/09/10/… -
哦,好的,谢谢。
标签: c# function methods lambda try-catch