我不知道如何处理SocketException以满足我的需求

时间:2015-01-22 11:40:00

标签: c# ftp .net-3.5 windows-mobile-6.5 opennetcf

引言及相关资料:

我是一位缺乏经验的C#开发人员,他继承了同事的项目,并负责修复某些错误。

其中一项任务是在Internet连接不可用时将应用程序切换到离线模式。我的同事用OpenNetCF library来帮助他处理应用程序的FTP连接部分,这对我来说更难。

问题出在"登录"形成。这是用户看到的第一件事,此表单会自动尝试连接到服务器。如果没有可用的连接,它就会闲置,显示消息"正在连接..."。

问题:

如果连接不可用,我的任务是切换到离线模式。

我努力解决这个问题:

有关进一步说明,我认为最好为登录表单onLoad事件提供代码:

// class fields:
delegate void StringDelegate(string value);
private FTP m_ftp;

private void dlgLoading_Load(object sender, EventArgs e)
{
    m_ftp = new FTP(address);
    m_ftp.ResponseReceived += new
        FTPResponseHandler(m_ftp_ResponseReceived);
    // m_ftp_Connected processes files in a certain way
    m_ftp.Connected += new FTPConnectedHandler(m_ftp_Connected);
    m_ftp.BeginConnect(username, password);
    // sets label's text to inform the user it is connecting
    lblText.Text += "Connecting...   ";
}

通过代码调试,我发现异常SocketException已被抛入另一个似乎属于OpenNETCF库的文件中。它的名称是FTP.cs,函数ConnectThread在尝试连接时会抛出它。 ConnectThread在上面的代码中由m_ftp.BeginConnect调用。

这非常好,因为我没有调整模拟器来连接互联网。

在JAVA中,函数可以抛出异常。

通过C#书籍/教程阅读,通过互联网搜索,我发现在C#中无法做到这一点。

然而,进一步搜索,我已经了解到,在C#例外"冒泡"什么时候不处理。

我已经得出结论,这可能是一个很好的编程习惯(基于this,可能是#34;冒泡"例外情况如果你不能处理它线程。

因此,我决定"冒泡"从库中的方法到登录表单中的代码的异常。然后我就能抓住它,并在离线模式下从那里继续。

我已从库/我的代码中的相关方法中删除了try/catch块,并将上述代码更改为:

// class fields:
delegate void StringDelegate(string value);
private FTP m_ftp;

private void dlgLoading_Load(object sender, EventArgs e)
{
    try
    {
        m_ftp = new FTP(address);
        m_ftp.ResponseReceived += new
            FTPResponseHandler(m_ftp_ResponseReceived);
        // m_ftp_Connected processes files in a certain way
        m_ftp.Connected += new FTPConnectedHandler(m_ftp_Connected);
        m_ftp.BeginConnect(username, password);
        // sets label's text to inform the user it is connecting
        lblText.Text += "Connecting...   ";
    }
    catch( Exception ex )
    {
        MessageBox.Show( ex.Message );
        // i thought of adding a check at this place
        // if exception is SocketException 
        // so I can launch "offline code" here
    }
}

我希望在那里捕获异常,但我的程序终止了。我不确定,但这让我觉得异常并没有在任何地方得到处理。

问题:

  • 我怎样才能正确地#34;冒泡"在这种情况下,这种类型的异常?
  • 我的方法是否有效(我提醒你,我很缺乏经验)?有没有比我的方法更好的解决方案?

缺乏经验,如果我遗漏了重要信息,我会道歉。请发表评论,我会尽快编辑我的帖子。

1 个答案:

答案 0 :(得分:0)

异步样式方法(例如BeginXxx)只能报告回调/事件中的错误,因为错误仅在调用返回后发生。处理回调中的错误。它将由EndXxx方法抛出。

对于每个BeginXxx呼叫,必须有相应的EndXxx呼叫,通常在回叫中进行。

这是APM模式。