我有一个代码可以在执行其他功能的事件中重新启动服务。
我在活动中尝试捕获事件中的所有内容,如下所示:
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);
}
}
答案 0 :(得分: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 .....");
答案 1 :(得分:1)
您需要
applyChangesAndCheckRestartService
或者您可以通过ref
f {传递enum
。叫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
}
第三种方法是使用可以单独捕捉的custom exceptions。
答案 2 :(得分: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);
另见:
答案 3 :(得分: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);
}
}
UPDATE 这假设您正在调用类似ServiceController.Start()
的内容,在失败时会抛出InvalidOperationException
,您可以轻松地将自己置于自己的错误状态或创建自己的错误自定义例外。
if (/* service didn't start */)
{
throw new InvalidOperationException("Could not start service.");
}