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() 中出现错误,我将因为 try catch 而得到相同的错误。

有没有更好的方法来处理这个问题。

就像我不介意 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或者你可以通过一个ref名为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
    }
    

第三种方法是使用可以单独捕获的自定义异常。

于 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()which throws InvalidOperationExceptionon failure 的东西,您可以自己轻松地将其抛出在您自己的错误条件下或创建您自己的自定义异常。

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