我不确定我想做的事情是否可行,但我认为必须有一些解决方法。假设两个例程;例程A和例程B.例程A和B都有自己的try-catch语句。例程A将调用例程B(如下所示),如果例程B遇到某些错误,例程A将被通知它。
以下是我的例子:
// Routine A
private void button13_Click(object sender, EventArgs e)
{
try
{
somevoid();
}
catch(Exception ex)
{
Console.WriteLine(ex.message); // Never makes it here ...
}
}
// Routine B
private void somevoid()
{
try
{
int i = 1;
int z = 0;
int g = i / z;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
答案 0 :(得分:2)
那么你可以在你的例程B中重新抛出异常,比如
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
这样,例程A也可以处理该异常。
不过,这与winforms无关,我会删除那个标志。希望有所帮助。
答案 1 :(得分:1)
我不确定你想要实现什么,但看起来,你需要在两个try catch块中捕获异常。如果是这样,请按如下所示更改您的代码:
private void somevoid()
{
try
{
int i = 1;
int z = 0;
int g = i / z;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
答案 2 :(得分:1)
你应该简单地在例程B的catch块上抛出异常:
....
Console.WriteLine(ex.Message);
throw new InvalidOperationException();
.....
然后例程a的Try块将捕获异常
答案 3 :(得分:0)
只需从例程B中删除try ... catch块。这样,如果例程B中存在异常,它将跳转到例程A中的catch块。
答案 4 :(得分:0)
如果您希望异常冒泡到button13_Click
,请从try-catch
移除somevoid
。如果你打算在例程A中重新抛出异常,那么你必须:
throw new Exception; // if you wish, you could have a custom exception here
...或
throw; // to simply re-throw the exception
在例行B的捕获区内。
答案 5 :(得分:0)
在此插入关于不吞咽异常的必要评论。
现在回答你的问题:你可以在这里做一些事情。
我已经看到一些关于重新抛出异常的答案。
您还可以抛出一种特定类型的异常(您自己创建的),您可以明确地捕获它 - 这为您提供了额外的控制和特异性。
您也可以从方法B返回bool
作为成功或失败的指标。您不必在每个调用方法B的地方实际使用它,但如果您根据方法B成功还是失败在方法A中执行不同的操作,则可以检查该结果。您只需返回true
块末尾的try
和false
块末尾的catch
。