我有一个关于处理异常的问题。我有一个Winform,它在每个表单上使用webservice代理进行数据检索和处理。这是我真的很困惑,很长一段时间决定哪个更好。
一个。对于Web服务中的每个调用,请尝试catch以显示错误消息,并允许用户再次单击该按钮重新尝试该过程。
B中。由于Web服务上发生错误并且错误可能是因为Web服务无法访问,只需在Program.cs中的WinMain函数中创建一个通用的try catch,并在应用程序关闭之前显示一条错误消息,指出Web服务无法访问
这里的主要论点是A更加用户友好,但需要大量的try catch代码。 B更容易编码,但只是让应用程序结束。我倾向于A,但我试图在网上搜索如何减少编写代码所需的代码。那里有什么想法吗?
答案 0 :(得分:3)
添加Web引用时,代码生成器会自动添加“Async”方法来访问Web服务。
我建议您使用Async方法而不是同步方法。关于这一点的好处是,Async方法的EventArgs提供了一个Error
属性,您可以使用该属性来查看请求是否成功。
private void CheckWebservice(string data)
{
WebService.Server server = new WebService.server();
server.methodCompleted += server_methodCompleted;
server.methodAsync(data);
}
private void server_methodCompleted(object sender, methodCompletedEventArgs e)
{
if (e.Error != null)
if (MessageBox.Show("Error", "Error", MessageBoxButtons.AbortRetryIgore) == DialogResult.Retry)
{
// call method to retry
}
else
{
if (e.Result == "OK") { // Great! }
}
}
如果由于某种原因必须使用同步方法,那么您当然可以编写一个类来封装调用Web服务的方法,以便您可以从各个地方调用它而无需复制代码。您的封装类可以执行所有错误处理并返回结果。
class CallWebService
{
public enum Result
{ Unknown, Success, NotAvailable, InvalidData } // etc
public Call(string data)
{
Webservice.Server server = new Webservice.Server();
string result = string.Empty;
try
{
result = server.getResult(data);
}
catch (Exception ex) // replace with appropriate exception class
{
return Result.NotAvailable;
}
if (result == "OK") return Result.Success
else return Result.InvalidData;
}
}
答案 1 :(得分:1)
将webservice调用和try / catch块封装在class =)
中