为什么我的错误没被抓住?

时间:2012-11-11 11:39:32

标签: c# error-handling

我有一个包含手机对象的课程。

手机是一部虚拟手机,在我班级的构造函数中,我传递了我希望连接的虚拟手机的IP地址和端口。

在构造函数中,我运行一个名为 Connect 的方法。在连接方法中,我从手机的IP地址/端口组合中实例化 IPEndPoint 对象,然后我实例化一个套接字对象,运行套接字对象的连接方法,并将 IPEndPoint 作为参数传入。

如果没有为特定电话(不是我的工作)正确配置电话服务器,则拒绝连接,并抛出 SocketException 。我想抓住这个例外。

这是一个Windows窗体应用程序。在Form对象的范围内,但在任何构造函数/方法的范围之外,我将我的手机作为未经实例化的私有字段,如此(IPhone是我的手机使用的接口):

private IPhone _phone;

我有一个名为 SetupPhone 的方法,我在这里实例化我的手机对象,并试图在这里捕捉异常:

private void SetupPhone()
{
    try
    {
        _phone = new Phone(AgentDetails.IPAddress, AgentDetails.Port);
    }
    catch(SocketException ex)
    {
        Log.LogException("Error mapping phone to port", ex);
        ShowBaloonTip("An error occured starting CTI. Please select your name from the list to try again", ToolTipIcon.Error);

        ChangeUser();
        return;
    }

    //Subscribe to Phone events here
}

这是电话对象的构造函数:

public Phone(string ipAddress, int port, string password = "FooBar")
{
    Connect(ipAddress, port, password);
}

以下是Connect方法:

public void Connect(string ipAddress, int port, string password)
{
    _phone = new IPEndPoint(IPAddress.Parse(ipAddress), port);
    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

    _socket.Connect(_phone);

    //Redacted
}

在未正确配置的手机上,抛出了我的SocketException,如下所示:

Exception

我是否认为在对象构造函数中运行的任何方法抛出的任何异常都应该通过围绕该对象实例化的try / catch块安全地捕获?或者情况不是这样吗?我想捕获实例化对象时可能出现的任何错误,这是不可能的吗?

1 个答案:

答案 0 :(得分:3)

http://www.blackwasp.co.uk/VSBreakOnException.aspx

  

在调试模式下运行程序时,使用Visual Studio的调试器,   遇到异常时,默认行为是暂停   除非在try / catch块中处理错误,否则执行。这个   可以为每种异常类型修改行为。

调试模式例外

  

在调试模式下执行软件时,Visual Studio会做出反应   不同于抛出的异常取决于是否异常   在try / catch / finally块中处理或未处理。什么时候   使用默认配置,未处理的异常导致   要暂停的程序和要显示的异常详细信息。处理   异常不会导致程序停止。你可以看到这个   在调试模式下执行以下代码。虽然一个   尝试除法时抛出DivideByZeroException   程序继续。如果你注释掉try和catch,那就是异常   停止执行。

try
{
    int i = 0;
    int j = 1;
    Console.WriteLine(j / i);
}
catch
{
    Console.WriteLine("Caught an exception");
}
Console.ReadLine();
  

在大多数情况下,此行为很有用。但是,有时候你   将要忽略特定类型的异常,即使未处理,   或打破通常会被忽略的已处理异常。您   可以使用可以查看的“例外”对话框来控制它   通过从“调试”菜单中选择“例外”或按   CTRL-ALT-E

     

对话框的主要区域显示a中的异常类型列表   树的结构。树的分支可以扩展显示   各种例外情况和每个例外情况   类别。为每个例外和组显示两个复选框。如果   选中“Thrown”复选框,程序将在中断时打破   选定的例外,或所选的一组例外,是   遇到。这包括已处理的异常。如果   选中“User-unhandled”复选框,程序将仅在该程序中断开   异常未处理。要尝试选项,请找到   树结构中的DivideByZeroException类型。寻找例外   快速,单击“查找”按钮,然后输入项目名称的一部分   你正在寻找。将找到第一个匹配项。如果这   不是所需的例外,单击“查找下一个”按钮进行循环   通过比赛。找到DivideByZeroException后,请检查   适当的“投掷”选项。如果您运行示例程序   将看到程序停止处理的异常。

全部重置

  

“例外”对话框中还有一些其他选项   值得注意的。第一个是全部重置按钮。如果你   已更改对话框中的选项以帮助调试您的   应用程序,您可以将所有选项重置为原始选项   单击此按钮设置。

配置自定义例外

  

如果已定义自己的继承异常类型   来自Exception类或其子类之一的功能   可能希望使用对话框进行配置。因为它不会是一个   标准异常类型,默认情况下不会出现在列表中。   但是,您可以通过单击“添加”按钮并提供它来添加它   细节。对于.NET例外,您应该确保选择   下拉列表中的“公共语言运行时异常”选项。   然后,您应该提供该例外的完全限定名称   类。例如,“MyNamespace.MyException”。