【问题标题】:Unexpected value in Exception object in catch block (c# compact framework)catch 块中的异常对象中的意外值(c# 紧凑框架)
【发布时间】:2009-09-28 20:33:34
【问题描述】:

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

 //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”在哪里以及为什么没有得到意外的值?

【问题讨论】:

  • 从您在下面写的 cmets 中,我对您真正想要什么感到更加困惑,我认为您需要详细说明您的问题。
  • 我曾经在一家公司工作,该公司有人因过度使用带有性甚至性别歧视含义的变量名而被解雇。我因为没有告诉任何人而受到谴责。只有他和我在工作,但他是前辈。从那以后,我选择了在其他地方工作。只是说。

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


【解决方案1】:

您可能弄错了 - 在这两种情况下,抛出一些其他异常(您收到的那个)而不是 SocketException。

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

在这种情况下,通常最好不要处理异常,让它冒泡。如果您觉得这不正确,请放入 SocketException 处理程序和通用异常处理程序,并确保检查异常中的堆栈跟踪(以及可能的 InnerException 属性):

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

【讨论】:

  • 我没记错 - 这两个例子我都有一个 ex.Message 与 try/catch 块之外的东西有关。
【解决方案2】:

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

如果你想处理特定的异常类型,你需要有类似这样的代码:

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

【讨论】:

  • 我很欣赏它正在捕获异常,但是如果用 Excption 捕获 ex.Message 的内容是错误的,如果我用 SockectExcption 捕获一切都很好。
  • 当你捕捉到通用异常时,你是否检查过 SocketException 没有被包裹在你捕捉的那个 InnerException 中?
【解决方案3】:

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

最佳实践是将 catch(Exception ex) 保留在应用程序的外部级别,以便您在一个地方处理所有意外异常。

【讨论】:

  • 我同意,但这并不能解释“异常前”如何在“消息”中包含意外数据
  • 如果您看到的只是消息,那么您没有足够的信息来了解问题所在。如果您有异常类型和完整的堆栈跟踪以及可能的内部异常,您可以更容易地理解为什么会发生异常。
  • 问题是'catch (Exception ex)' 捕捉到带有意外(即不正确)信息的异常。如果与抛出的异常无关,任何信息有什么用?
  • 我不确定您所说的信息不正确是什么意思。根据定义意外抛出异常,通常是由于资源不足或代码中的某些错误。您希望在某处有一个 Catch All 通知您所有意外异常,以便您更改代码来处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2011-07-30
  • 1970-01-01
相关资源
最近更新 更多