catch块中的Exception对象中的意外值(c#compact framework)

时间:2009-09-25 16:08:02

标签: c# exception windows-mobile compact-framework

我维护了一个c#紧凑框架应用程序,在2天内有2个案例,其中一个被捕获的异常在Message中有一个意外的字符串。两次都是由于抛出了不同的异常类型。在以下代码中捕获了套接字异常,但显示的消息与其他内容相关

 //method1
 try
 {
     soc.Connect(new IPEndPoint(IPAddress.Parse(_serverAddress), _serverPort));

 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message)
 }



 //method2
 try
 {
     m_socServer.Connect(new IPEndPoint(IPAddress.Parse(_serverAddress), _serverPort));

 }
 catch (SocketException sex)
 {
     MessageBox.Show(sex.Message)
 }

在'method1'中,在连接失败时抛出异常,输入了catch块,但是我知道的消息框显示的异常来自此try块之外。在'method2'中捕获异常并且消息正确。这两个try catch块是代码中唯一改变的东西。

我还没有在一个小的测试程序中重现这个,但我维护的程序有这种行为。

'method1'在哪里以及为什么没有得到意外的值?

3 个答案:

答案 0 :(得分:2)

你可能犯了错误 - 在这两种情况下,其他一些异常(你正在接收的异常)被抛出而不是一个SocketException。

如果您只是希望抛出SocketException,那么您应该只为该情况提供一个处理程序。在这种情况下,其他例外可能是非常特殊的 - 这意味着您无法正确恢复。

在这种情况下,通常最好不处理异常,并让它冒出来。如果您认为这是不正确的,请将SocketException处理程序和一般异常处理程序放入其中,并确保在异常中检查堆栈跟踪(以及可能的InnerException属性):

try
{
    //throw SocketException
}
catch (SocketException sockEx)
{
    MessageBox.Show(sockEx.Message)
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message)
}

答案 1 :(得分:1)

您上面的语句将捕获所有异常,而不仅仅是特定类型的异常。

如果要处理特定的异常类型,则需要使用与此类似的代码:

try
{
    // Do some work.
}
catch(SocketException ex)
{
    // Handle a known SocketException
}
catch(NullReferenceException ex)
{
    // Handle a known NullReferenceException
}
catch(OtherSpecificException ex)
{
    // You get the idea
}
catch(Exception ex)
{
    // This will be everything else you haven't explicitly caught.
    // It will also give you the most generic details about the Exception.
}

答案 2 :(得分:1)

当你处理异常时,你可以想到谁需要被告知错误:用户?还是管理员/开发者?
您可以定义SocketException包含需要通知用户的消息,并且应保存每个其他异常以供开发人员或管理员查看。例如,您可以将完整的异常写入文件,或者可以将事件写入特殊的MessageBox。 “意外错误,请通知管理员:”+ ex.ToString()。
确保编写整个ex.ToString(),因为它包含stacktrace和所有InnerException。

最佳做法是将catch(Exception ex)保留在应用程序的外层,以便在一个地方处理所有意外异常。