C# try catch 模式帮助

标签 c# .net try-catch design-patterns

我们总是需要在我们的代码中尝试 catch,它变得很丑

public void foo()
{
  try
  {
    DoSomething();
  }
  catch(Exception e)
  {
     //do whatever with e
  }
}

public int FooReturnInt()
{
  try
  {
     return IntAfterSomeCalculation();
  }
  catch(Exception e)
  {
    //do exactly whatever with e as foo()
  }
}

假设我们有一个巨大的类,其中包含许多这样的公共(public)函数,我们必须在每个函数中应用相同的 try catch。

理想情况下,因为 try catch 部分是相同的,我们可以将 Func<> 作为参数传递给辅助函数,该辅助函数执行如下操作

public void TryCatch(Func<something> theFunction)
{
  try
  {
    theFunction();
  }
  catch(Exception e)
  {
    //processthe common exception        
  }
}

然后我想这会整理我的代码很多,现在的问题是如何正确地编写这个函数?此函数的返回类型取决于 theFunction 的返回类型。

最佳答案

如果您真的认为这是必需的,您可以使用:

public T TryCatch<T>(Func<T> theFunction)
{
  try
  {
    return theFunction();
  }
  catch(Exception e)
  {
    // You'll need to either rethrow here, or return default(T) etc
  }
}

但是,我通常会反对它。您真的确定在所有这些方法中都需要 try/catch block 吗?一般来说,不应该有很多 try/catch block ,除非 catch 只是包装异常并重新抛出...例如,即使在 C# 中这种情况也比在 Java 中少见。

当您可以真正优雅地处理或者您需要防止进程仅仅因为一个请求失败(例如)而崩溃时,您通常应该捕获异常。我倾向于写很少的 catch block ——我很少能真正从错误中恢复 :)

我怀疑这种方法会导致调试时间变得更加困难。它可能仍然值得做,但您应该首先仔细考虑利弊。

关于C# try catch 模式帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098126/

相关文章:

c# - 如何减少 Windows 服务的高 CPU 使用率?

C# - TcpClient - 检测流结束?

c# - 播放时加载纹理

c# - 如何将字符串转换为小数点后三位的小数?

php - try/catch 在 PHP 中不起作用

c# - 在 C# 中替换/更改空白或空字符串值

c++ - 在 .NET Core 3.1 中运行托管 C++/CLI 程序集时出现错误的图像格式

.net - 如何卸载未出现在“添加/删除程序”中的 ClickOnce 应用程序?

java - 程序错误地打印到控制台

c# - 如果在 "using"语句中使用try/catch,一次性资源会被释放吗?