我在C#中构建了一个应用程序,我必须在捕获异常后立即中断。我使用return
,但它返回到调用此模块并继续执行的模块。该怎么办?
我的代码看起来像这样:
class a
{
b bee=new b{};
bee.read(name);
bee.write(name);// don want this to get executed if exception is thrown
}
class b
{
read(string name)
{
try{}
catch
{
//caught;
//what should be put here so that it just stops after dialog
// box is shown without moving to the write method?
}
write(string name) {}
}
}
答案 0 :(得分:1)
您的代码示例不正确,但我们假设您使用此代码的方法:
void M()
{
b bee=new b();
bee.read(name);
bee.write(name);// don want this to get executed if exception is thrown
}
如果是这样,您必须在此方法中捕获异常,而不是read
方法。像这样:
void M()
{
try {
b bee=new b();
bee.read(name);
bee.write(name);// don want this to get executed if exception is thrown
}
catch(Exception e) {
// Proper error handling
}
}
在read
方法中,您不应该禁止例外。要么根本不抓住它们,要么重新抛出它们(或者更好的是,抛出一个新的例外,旧的例外是InnerExeption
)。
如果以这种方式处理方法M中的异常,如果在bee.write(name)
内某处发生异常,则不会执行bee.read(name)
行。
答案 1 :(得分:1)
让异常冒泡到调用方法:
class A {
public void Method() {
B bee = new B{};
try {
bee.Read(name);
bee.Write(name);
} catch(Exception ex) {
// handle exception if needed
}
}
}
class B {
public void Read(string name) {
try{
...
} catch(Exception ex) {
// handle exception if needed
throw;
}
}
public void Write(string name) {
}
}
注意:如果是posible,您应该捕获更具体的异常类,而不是捕获基类Exception。没有excpetion参数的catch语法已经过时。
答案 2 :(得分:0)
您可以按照以下方式执行此操作
class a
{
b bee = new b();
try
{
bee.read(name);
bee.write(name);
}
catch(Exception ex)
{
//handle error here
}
}
class b
{
//These are your method implementations without catching the exceptions in b
read
write
}
如果你在方法中捕获异常,那么你将无法知道方法的exceution状态而没有hangind方法的某种错误状态。无论是布尔返回还是b中可访问的错误代码。
答案 3 :(得分:0)
为什么不让read方法返回一个对调用者有意义的值?所以调用者检查读取的返回值,如果是(例如)null,则不调用write。或者,您的read方法可以返回一个枚举值,该值告诉调用者read方法退出的条件。
作为另一个选项,调用者可以使用doNotProceed方法实现接口,然后将自身传递给read方法。在异常读取调用caller.doNotProceed时,在调用者对象中设置一个内部变量,这告诉它不要继续写入。
你有很多选择
答案 4 :(得分:0)
您可以使用return语句或重新抛出错误并将另一个父try尝试捕获,但最好重新构建代码。