2

我有一个包含Phone对象的类。

电话是一个虚拟电话,在我的类的构造函数中,我传入了我希望连接的虚拟电话的 IP 地址和端口。

在构造函数中,我运行了一个名为Connect的方法。在Connect方法中,我从电话的 IP 地址/端口组合中实例化一个IPEndPoint对象,然后实例化一个Socket对象,并运行 Socket 对象的Connect方法,传入我的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);
}

这是连接方法:

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 如下所示:

例外

我是否认为在对象构造函数中运行的任何方法引发的任何异常都应该被放置在该对象实例化周围的 try/catch 块安全地捕获?还是不是这样?我想捕捉实例化我的对象时可能发生的任何错误,这不可能吗?

4

1 回答 1

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 来查看该对话框。

对话框的主要区域以树状结构显示异常类型列表。树的分支可以展开以显示各种异常组和每个类别中的各个类型。每个例外和组显示两个复选框。如果勾选了“Thrown”复选框,程序将在遇到选定的异常或选定的一组异常时中断。这包括已处理的异常。如果勾选了“用户未处理”复选框,则只有在未处理异常时程序才会中断。要尝试这些选项,请在树结构中找到 DivideByZeroException 类型。要快速查找异常,请单击“查找”按钮并输入您要搜索的项目的部分名称。将找到第一个匹配项。如果这不是所需的例外,请单击“查找下一个”按钮以循环查看匹配项。找到 DivideByZeroException 后,检查相应的“Thrown”选项。如果您运行示例程序,您将看到程序在处理的异常上停止。

重置全部

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

配置自定义例外

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

于 2012-11-11T11:47:28.897 回答