处理异常后需要中断

时间:2011-05-18 05:38:28

标签: c# exception

我在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) {}                
    }
}

5 个答案:

答案 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尝试捕获,但最好重新构建代码。