【问题标题】:Throw exception from Called function to the Caller Function's Catch Block将异常从被调用函数抛出到调用函数的 Catch 块
【发布时间】:2011-10-24 20:28:13
【问题描述】:
internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw ex;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
        ...
    }
}


//Reading File Contents

public void ReadFile()
{
    try
    {
        ...
        ReadCSVFile(filePath);
        ...
    }
    catch(FileNotFoundException ex)
    {
        ...
    }
    catch(Exception ex)
    {
        ...
    }
}

在上面的代码示例中,我有两个函数ReadFileReadCSVFile
ReadCSVFile 中,我得到了一个FileNotFoundException 类型的异常,它被catch(FileNotFoundException) 块捕获。但是当我抛出这个异常被ReadFile函数的catch(FileNotFoundException)捕获时,它会被catch(Exception)块而不是catch(FileNotFoundException)捕获。此外,在调试时,ex 的值显示为 Object Not Initialized。如何在不丢失内部异常或至少异常消息的情况下将异常从被调用函数抛出到调用函数的 catch 块?

【问题讨论】:

  • 当您使用相同的异常本地对象时,您确定内部异常的类型为FileNotFoundException
  • 不是重复的,而是一个缺少信息来说明为什么它不重复的问题:)

标签: c# exception try-catch-finally


【解决方案1】:

你必须使用throw; 而不是throw ex;

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw;
    }
    catch(Exception ex)
    {
        throw;
    }
    finally
    {
        ...
    }
}

除此之外,如果你在 catch 块中什么都不做,只是重新抛出,你根本不需要 catch 块:

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    finally
    {
        ...
    }
}

仅实现 catch 块:

  1. 当您想要处理异常时。
  2. 当您想通过抛出一个新异常并将捕获的异常作为内部异常来向异常添加额外信息时:

    catch(Exception exc) { throw new MessageException("Message", exc); }

您不必在可能出现异常的每个方法中都实现 catch 块。

【讨论】:

  • 我尝试只使用 throw 但结果保持不变。此外,我实际上是在异常中附加一条自定义消息,然后将其抛出。
  • 然后你必须抛出一个新的异常,自定义消息和捕获的异常作为内部异常:catch(Exception exc) { throw new MessageException("Message", exc); }
【解决方案2】:

只需在被调用函数中使用 throw。不要重载具有多种异常类型的 catch 块。让来电者处理。

【讨论】:

    【解决方案3】:

    你应该替换

    throw ex;
    

    通过

    throw;
    

    【讨论】:

    • 我试过了,但没有帮助。我仍然在异常对象的调用者的 catch 块中得到 ObjectNotInitialized。
    • 这可能是另一个例外?
    【解决方案4】:

    在被调用的函数中只需像这样使用 throw

     try
     {
       //you code
     }
     catch
     {
         throw;
    }
    

    现在,如果这里出现异常,那么这将被调用函数捕获。

    【讨论】:

      【解决方案5】:

      您的代码在这里运行良好,检查这里http://ideone.com/jOlYQ

      【讨论】:

      • 如果sn-p代码属于web服务而不是简单的控制台代码,有什么区别???
      • 应该没有。 Web 服务又是一种托管在某个容器中的服务,它可能是另一个控制台应用程序,尽管它没有一个可视化的控制台呈现给用户。所以它基本上是 C# 而不是。
      猜你喜欢
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多