14
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 块?

4

5 回答 5

21

您必须使用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 块。

于 2011-08-11T10:30:35.697 回答
2

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

于 2011-08-11T10:29:55.150 回答
2

你应该更换

throw ex;

经过

throw;
于 2011-08-11T10:30:41.613 回答
1

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

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

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

于 2011-08-11T10:34:52.890 回答
0

您的代码在这里可以正常工作,请在此处查看http://ideone.com/jOlYQ

于 2011-08-11T10:46:55.940 回答