我有以下代码由answer posted by Jean-Michel Bezeau
提供bool isAlive = false;
string fixedAddress = "http://localhost:8732/Design_Time_Addresses/WCFService/mex";
System.ServiceModel.Description.ServiceEndpointCollection availableBindings = System.ServiceModel.Description.MetadataResolver.Resolve(typeof(WCFService.IAlive), new EndpointAddress(fixedAddress));
ChannelFactory<WCFService.IAlive> factoryService = new ChannelFactory<WCFService.IAlive>(availableBindings[0]);
WCFService.IAlive accesService = factoryService.CreateChannel();
isAlive = accesService.IsAlive();
我希望我的程序能够继续,即使无法访问WCF服务,以便我可以通过电子邮件通知某人并将其添加到日志中。我想这样做:
bool isAlive = false;
try
{
string fixedAddress = "http://localhost:8732/Design_Time_Addresses/WCFService/mex";
System.ServiceModel.Description.ServiceEndpointCollection availableBindings = System.ServiceModel.Description.MetadataResolver.Resolve(typeof(WCFService.IAlive), new EndpointAddress(fixedAddress));
ChannelFactory<WCFService.IAlive> factoryService = new ChannelFactory<WCFService.IAlive>(availableBindings[0]);
WCFService.IAlive accesService = factoryService.CreateChannel();
isAlive = accesService.IsAlive();
}
catch {}
finally
{
if (isAlive)
{
//add success message to log
}
else
{
//add warning message to log
//send email notification
}
}
但是,我不喜欢捕捉所有这样的例外(我知道这是不好的做法)。什么是最好的方法呢?
我应该抓住特殊例外吗?或者,这是实施使用声明的好时机(如果可以,我可以如何帮助解决)?
答案 0 :(得分:1)
异常可能是很多事情 - 它可能只是一个超时,或404错误,500错误,连接重置错误......所以可能会抛出一堆异常。在这种特殊情况下,我不会遇到全局问题。
如果第一次再次尝试失败,您可能也想考虑重试,以防它只是暂停。
或者,如果您已经在应用程序上进行了全局错误处理,那么您可能不希望吞下该异常,因此您可以使用finally块而不使用catch:
try
{
....
}
finally
{
....
}
但是如果它是应用无法自行处理或解决的真正错误,您只想这样做。