0

他の機能も実行するイベントでサービスを再起動するコードがあります。

私はこのようなイベント内のすべてのイベントで試してみることができます:

private void btnApply_Click(object sender, EventArgs e)
    {
        try
        {               
            applyChangesAndCheckRestartService();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error loading page.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

private void applyChangesAndCheckRestartService()
    {
        string svrPortNo = CommonCodeClass.getTagValue(CommonCodeClass.xml_SvrPortNoTag, CommonCodeClass.configLocation + CommonCodeClass.configXML);               

        if (!ApplyChangesForSettings())
        {                
            return;
        }

        if (svrPortNo != tbSvrPortNo.Text)
        {               
            CommonCodeClass.CheckToRestartService();
        }
    }

これで、ApplyChangesForSettings()中にエラーが発生した場合、「ページの読み込み中にエラーが発生しました」というエラーポップアップが表示されます。

CheckToRestartService()にエラーがある場合、trycatchが原因で同じエラーが発生します。

これを処理するためのより良い方法はありますか?

ApplyChangesForSettings()のエラー読み込みページを気にしないように、CheckToRestartService()の場合は、「サービスを再起動できません」などのエラーが表示されます。

任意の提案をいただければ幸いです。ありがとう

internal static void CheckToRestartService()
    {
        DialogResult result = MessageBox.Show(CommonCodeClass.resartServiceMessage, "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
        if (result == DialogResult.Yes)
        {
            CommonCodeClass.RestartService(CommonCodeClass.serviceName, 60000);
        }
    }
4

4 に答える 4

1

この状況を処理する最も速い方法は、内部メソッドのいずれかが失敗したときに例外をスローし、btnApply_Click でメッセージをキャッチすることです。

MessageBox.Show(ex.Message, "Error",  .....);

最も正しい方法は、独自の例外タイプを作成し、メソッド内で失敗条件が発生した場合に独自の例外をスローすることです。たとえば、このようなクラスを作成します

public class RestartServiceException : Exception
{
    public RestartServiceException(string message)
        : base(message)
    {
    }
    // You could also write other constructors with different parameters and use internal logic
    // to process your error message
}

次に、 CheckToRestartService メソッド内で失敗条件が発生したときに、そのクラスのインスタンスを使用します

   if(fail == true)
       throw new RestartServiceException("The service could not be started because .....");
于 2012-05-01T21:04:32.380 に答える
1

あなたはする必要があります

  • で例外をキャッチapplyChangesAndCheckRestartService
  • enumまたは、と呼ばれるby reffeを渡すことができますRestartStatus

    enum RestartStatus{success, unableToRestart, unableToApplySettings};
    
    RestartStatus status = RestartStatus.success;
    applyChangesAndCheckRestartService(status);
    if(status != RestartStatus.success) //....
    
    private void applyChangesAndCheckRestartService(out RestartStatus status)
    {
        // set the status variable accordingly
    }
    

3 つ目の方法は、個別にキャッチできるカスタム例外を使用することです。

于 2012-05-01T21:05:38.910 に答える
1

おそらく、さまざまな関数を別々の try/catch ブロックでラップする必要があるだけです。

    try {
        if (!ApplyChangesForSettings())
           return;
    }
    catch (Exception ex) {
        MessageBox.Show("Error loading page.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    if (svrPortNo != tbSvrPortNo.Text) {      
        try {         
            CommonCodeClass.CheckToRestartService();
        }
        catch (Exception ex) {
            MessageBox.Show("Unable to restart services.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

または、異なるタイプの例外がスローされた場合は、異なるタイプの例外をキャッチすることを検討できます。

string errmsg = string.empty;
try { 
    DoSomething();
}
catch (FooException) {
   errmsg = "There was a Foo error";
}
catch (WidgetException) {
   errmsg = "There was a problem with a Widget";
}
catch (Exception ex) {
   errmsg = "General problem: " + ex.Message;
}

if (!string.IsNullOrEmpty(errmsg))
   MessageBox.Show(errmsg);

以下も参照してください。

于 2012-05-01T21:06:27.900 に答える
1

それらは異なる例外をスローしますか? その場合は、例外フィルタリングを使用できます。

private void btnApply_Click(object sender, EventArgs e)
{
    try
    {               
        applyChangesAndCheckRestartService();
    }

    // catch service start exceptions
    catch (InvalidOperationException ioex)
    {
        // display message that couldn't start service
    }

    // catch rest
    catch (Exception ex)
    {
        MessageBox.Show("Error loading page.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

更新ServiceController.Start()これは、失敗時にスローするようなものを呼び出していると仮定していますInvalidOperationException。独自のエラー条件でこれを自分で簡単にスローしたり、独自のカスタム例外を作成したりできます。

if (/* service didn't start */)
{
    throw new InvalidOperationException("Could not start service.");
}
于 2012-05-01T21:07:27.147 に答える