我是一位缺乏经验的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
}
}
我希望在那里捕获异常,但我的程序终止了。我不确定,但这让我觉得异常并没有在任何地方得到处理。
缺乏经验,如果我遗漏了重要信息,我会道歉。请发表评论,我会尽快编辑我的帖子。
答案 0 :(得分:0)
异步样式方法(例如BeginXxx)只能报告回调/事件中的错误,因为错误仅在调用返回后发生。处理回调中的错误。它将由EndXxx方法抛出。
对于每个BeginXxx呼叫,必须有相应的EndXxx呼叫,通常在回叫中进行。
这是APM模式。