如何处理Web API控制器抛出的异常?
我正在使用Enterprise Tester API来导入和更新Web应用程序上的内容。该方案将工作的优良几个小时,但偶尔它运行到这个未处理的异常:如何处理Web API控制器抛出的异常?
型“System.Net.Http.HttpRequestException”未处理的异常发生在EnterpriseTester.API.Client.dll
附加信息:System.Net.Http.HttpRequestException状态代码,表明没有成功:500(内部服务器错误)
在这一点上,在这个地方发生异常行的Visual Studio休息。但是,当我点击“继续”时,程序将再次正确执行。
从网上搜索,似乎我应该使用try catch
块来处理异常。我也希望能够稍微等一下,然后再次执行相同的行以访问API。
try
{
client.UpdateScriptRun(Id,Run);
}
catch (HttpRequestException e)
{
Console.Writeline("HttpRequestException: {0}", e.Message);
Thread.Sleep(1000);
client.UpdateScriptRun(Id,Run);
}
我不确定这样的事情是否可以解决问题,或者如果我需要查看一个完全不同的解决方案。
如果您能指导我找到适合此问题的解决方案,将不胜感激。谢谢!
通常最好追查异常的根本原因,看看是否有办法解决它。如果因为网络出现间歇性问题而发生连接错误是一回事,但500错误表明服务器出现问题。如果您有任何方法可以追踪并修复服务器端错误,那是最好的方法。
如果您无法控制服务器,并且只是试图让自己的应用程序尽可能地工作,并知道服务器偶尔无故失败,那么try/catch解决方案将有所帮助。我会做一些额外的建议,虽然:
- 使用更强大的日志记录机制,这样你就可以从日志文件中告诉事情是如何经常走错了,也许使用该信息追查问题。将这些参数包含在日志消息中,以防信息变得有用。
- 创建一个帮助器方法来帮助您进行重试,以便您可以在别处重新使用该模式。
- 在这种辅助方法中,几乎立即开始重试,然后等待指数增长的时间段(10ms,100ms,1000ms),直到您看到成功或达到合理的最大限制。
- 无论是消耗代码,都应该有自己的try/catch,以确保用户在不正常工作时拥有体面的体验。
谢谢你的回答。由于我无法访问服务器端,因此您对辅助方法的建议听起来很有希望。对于这个解决方案,我应该在“catch”块中使用我的帮助器方法吗?或者你是否建议在助手方法中使用try-catch。我很抱歉,如果我的问题看起来微不足道,我一点也不熟悉这一点。任何有用的链接到相关的主题也将有所帮助。谢谢! – MShaw
将try/catch放在helper方法内部的一个循环中,[有点像这样](https://stackoverflow.com/a/1563234/120955)。或者你可能觉得值得使用其他人写的图书馆,比如[Polly](http://www.thepollyproject.org/2016/10/25/polly-5-0-a-wider-resilience-framework/) )。 – StriplingWarrior
您上面发布的代码是否在WebApiController中运行?如果第一次调用引发异常,为什么要让POST挂起?为什么不从你的控制器返回500,然后让你的客户再试一次? – maccettura
@maccettura感谢您的问题。上面的代码来自一个控制台应用程序。该应用程序正在将我的桌面上的一千个文档/脚本导入到Enterprise Tester。 “UpdateScriptRun”是我的程序调用POST的API方法之一。如果我返回500,那么客户端将不得不从头再运行这个程序。你会建议作为替代解决方案吗? – MShaw