C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: usingでの例外のリトライ


(過去ログ 112 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■66315 / inTopicNo.1)  usingでの例外のリトライ
  
□投稿者/ fullhappy (11回)-(2013/04/15(Mon) 10:15:52)

分類:[.NET 全般] 

c#4.0です。

using()の括弧の中での例外に対して
リトライを行いたいのですが
エレガントな書き方ができません。

技があれば、教えてください。

ファイル書き込みが重なる事を考慮し、
10回のリトライをしています。

     //リトライループ(Count:リトライ回数)
    for (var Count = 0;; Count++)
    {
        System.IO.StreamWriter sw = null;
        try
        {
            using (sw = new System.IO.StreamWriter(@"C:\test.log", true))
            {
                書き込み処理(sw);
                sw.Close();
            }
        }
        catch
        {
            if (sw != null)        //using以外の例外
                throw;

            if (Count == 10)    //10回目のリトライ失敗
                throw;

            System.Threading.Thread.Sleep(1000);  //1秒待つ
            continue;
        }

        break; //成功
    }

よろしくお願いします。

引用返信 編集キー/
■66317 / inTopicNo.2)  Re[1]: usingでの例外のリトライ
□投稿者/ ムーミン (3回)-(2013/04/15(Mon) 10:36:03)
2013/04/15(Mon) 11:15:47 編集(投稿者)
new System.IO.StreamWriter(@"C:\test.log", true)で例外が出た場合にリトライをしたいということですね。
(書き込み処理(sw);の箇所で発生した例外はスローしたい)

それならば、usingするStreamWriterのインスタンス用にSystem.IO.StreamWriter(@"C:\test.log", true)を生成するメソッドを作成し、
その中でリトライのロジックを含めたらどうでしょう。
(以下のコード例は試していないので、誤記等あったらごめんなさい。)

using (System.IO.StreamWriter sw = MyMethod(@"C:\test.log", true))
{
    書き込み処理(sw);
    sw.Close();
}

private System.IO.StreamWriter MyMethod(string logfile, bool overwrite)
{
    System.IO.StreamWriter sw;
    try
    {
        sw = new System.IO.StreamWriter(logfile, overwrite);
    }
    catch
    {
        //ここにリトライの処理を入れる(以下略)
    }
    return sw;
}

引用返信 編集キー/
■66321 / inTopicNo.3)  Re[2]: usingでの例外のリトライ
□投稿者/ fullhappy (12回)-(2013/04/15(Mon) 20:11:44)
usingの括弧の中はnewしか考えていませんでした。
これでスッキリ書けます。
ありがとうございました。

No66317 (ムーミン さん) に返信
> 2013/04/15(Mon) 11:15:47 編集(投稿者)
>
> new System.IO.StreamWriter(@"C:\test.log", true)で例外が出た場合にリトライをしたいということですね。
> (書き込み処理(sw);の箇所で発生した例外はスローしたい)
>
> それならば、usingするStreamWriterのインスタンス用にSystem.IO.StreamWriter(@"C:\test.log", true)を生成するメソッドを作成し、
> その中でリトライのロジックを含めたらどうでしょう。
> (以下のコード例は試していないので、誤記等あったらごめんなさい。)
>
> using (System.IO.StreamWriter sw = MyMethod(@"C:\test.log", true))
> {
> 書き込み処理(sw);
> sw.Close();
> }
>
> private System.IO.StreamWriter MyMethod(string logfile, bool overwrite)
> {
> System.IO.StreamWriter sw;
> try
> {
> sw = new System.IO.StreamWriter(logfile, overwrite);
> }
> catch
> {
> //ここにリトライの処理を入れる(以下略)
> }
> return sw;
> }
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -