将Called函数的异常抛出到Caller Function的Catch Block

时间:2011-08-11 10:25:45

标签: c# exception-handling try-catch-finally

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)
    {
        ...
    }
}

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

5 个答案:

答案 0 :(得分:12)

您必须使用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); }

  3. 您不必在异常可以通过的每个方法中实现catch块。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你应该替换

throw ex;

通过

throw;

答案 3 :(得分:0)

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

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

现在,如果此处出现异常,则调用者函数将捕获此异常。

答案 4 :(得分:0)

您的代码在此工作正常,请点击此处http://ideone.com/jOlYQ