0

我有以下代码由 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
    }
}

但是,我不喜欢捕获所有这样的异常(我知道这是不好的做法)。解决这个问题的最佳方法是什么?

我应该捕捉到特殊的例外吗?或者,现在是实现 using 语句的好时机吗(如果可以,我可以提供一些帮助)吗?

4

1 回答 1

1

异常可能是很多东西——它可能只是一个超时,或者一个 404 错误,一个 500 错误,一个连接重置错误......所以可能会有一堆可以抛出的异常。在这种特殊情况下,我不会对全局捕获有任何问题。

您可能还需要考虑重试,如果第一次失败,请再试一次,以防它只是超时。

或者,如果您的应用程序已经有全局错误处理,您可能不想吞下异常,因此您可以只使用 finally 块而不使用 catch:

try 
{
    ....
}
finally 
{
    ....
}

但是,只有当这是应用程序无法自行处理或解决的真正错误时,您才想这样做。

于 2013-01-18T03:52:17.287 回答