0

Jean-MichelBezeauによって投稿された回答のおかげで次のコードがあります

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ブロックを使用できます。

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

ただし、これを実行するのは、アプリがそれ自体で処理または解決できない真のエラーである場合のみです。

于 2013-01-18T03:52:17.287 に答える