简介和相关信息:
我是一位经验不足的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#书籍/教程,通过Internet和此处进行搜索,我发现这在C#中无法完成。
但是,通过进一步搜索,我了解到在C#中,如果不处理异常,则会“冒泡”。
我得出的结论是,这可能是基于this线程的良好编程习惯(“无法处理”异常)。
因此,我决定从库中的方法一直“冒泡”异常,一直到登录表单中的代码。然后,我可以抓住它,并以离线模式从那里继续。
我从库/我的代码中的相关方法中删除了
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
}
}
我希望在那里捕获异常,但是我的程序终止了。我不确定,但这使我认为异常不会在任何地方得到处理。
问题:
在这种情况下,如何正确“冒泡”这种类型的异常?
我的方法有效吗(提醒您,我没有经验)?有没有比我的方法更好的解决方案?
由于经验不足,如果我忽略了重要信息,我深表歉意。请发表评论,我将尽快编辑我的帖子。
最佳答案
异步样式的方法(例如BeginXxx)只能报告回调/事件中的错误,因为错误仅在调用返回后才会发生。处理回调中的错误。它会由EndXxx方法抛出。
对于每个BeginXxx调用,必须有一个对应的EndXxx调用,通常在回调中进行。
这是APM模式。
关于c# - 我不知道如何处理SocketException以适应我的需求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28087921/