2011-08-11 48 views
8
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中,我得到了一个FileNotFoundExceptioon类型的异常,该异常在catch(FileNotFoundException)块中被捕获。但是当我抛出这个异常被捕获到ReadFile()函数的catch(FileNotFoundException)时,它会被捕获(Exception)块而不是捕获(FileNotFoundException)。而且,在调试时,ex的值表示为Object Not Initialized。如何将被调用函数的异常抛出到调用者函数的catch块而不丢失内部异常或至少是异常消息?将被调用函数的异常抛出到调用函数的捕获块

+2

可能重复[.NET - 引发异常的最佳实践(http://stackoverflow.com/questions/22623/net-throwing-exceptions-best-practices ) – Chris

+0

当你使用相同的异常本地对象时,你确定内部异常的类型是'FileNotFoundException'吗? – NirMH

+0

不是重复的,但缺乏信息的问题,以显示它为什么不重复:) – PVitt

回答

10

你必须使用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块,通过抛出一个新的异常,捕获一个作为内部异常或者当你想处理这个异常。您不必在每个方法中都可以实现一个catch块,在这个方法中,异常可以通过。

+0

我试过只使用抛出,但结果保持不变。此外,我实际上将一个自定义消息附加到异常,然后抛出它。 –

+0

然后,你必须抛出一个新的异常与自定义消息和捕获的异常作为内部异常:catch(Exception exc){抛出new MessageException(“Message”,exc); } – PVitt

1

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

1

此时应更换

throw ex; 

通过

throw; 
+0

我试过了,但没有帮助。我仍然在Exception对象的调用者的catch块中获得ObjectNotInitialized。 –

+1

这可能是其他异常? – sll

0

在调用函数只是用罚球这样

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

现在,如果异常出现在这里,那么这将被捕获由来电功能。

0

你的代码工作在这里很好,这里检查http://ideone.com/jOlYQ

+0

如果代码段属于Web服务而不是简单的控制台代码,是否有区别? –

+0

不应该有。 Web服务又是一个服务器,它托管在某个容器中,可能是另一个控制台应用程序,尽管它有一个代表用户的视觉控制台。所以它基本上是C#和nope。 – Zenwalker

相关问题