我维护了一个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'在哪里以及为什么没有得到意外的值?
答案 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)保留在应用程序的外层,以便在一个地方处理所有意外异常。