异常处理中的设计模式

3

我正在编写一个库类,可以被多个类使用。为了说明问题,我简化了示例。假设我有三个类:A、B和C:

public class B
{
  public static string B_Method()
  {
    string bstr = String.Empty;

    try
       {


        //Do Something

       }

    catch
        {

        //Do Something

        }

  return bstr;

}

B是我正在编写的库类。现在有另外两个类A和C:

public class A
{
  public void A_Method()
  {
   string astr = B.B_Method();
  }

}

public class C
{
 public void C_Method()
  {
   string cstr = B.B_Method();
  }

}

这个问题是关于异常处理的。我希望类A和类B中各自的方法能以不同的方式处理在B_Method中发生的异常。

我查找了框架设计模式,但感觉它并没有什么用。


1
如果你想让调用者处理异常,为什么B要捕获异常呢? - Paolo
1
那么为什么不让异常从B_Method传播,让调用者进行try/catch呢? - JB Nizet
假设B_method正在向服务器发送请求并获取响应。它将相同的响应发送回调用者。如果我在发送请求时没有捕获异常,那么执行会停在那里吗? - futurenext110
4个回答

9
我通常遵循的方法是:
  • 如果我的方法可以利用异常做一些有用的事情,我会捕获并处理它。
  • 如果不行,我就不捕获它,并让调用代码来处理它。

唯一需要放置“catch all”块的地方是在UI代码的入口点(例如按钮单击的事件处理程序等),因为在那里不捕获异常可能会导致进程崩溃。

这也意味着异常子句应该捕获您可以处理的特定异常。

有时我看到的一种方法是捕获异常,将其包装成新的异常类型并抛出。虽然这提供了一些可追踪性,但我也觉得它会在调用代码中的异常处理中删除一些选项,例如具有不同场景的特定捕获子句。在这些情况下,您将需要使用if语句检查内部异常,这在我的眼中不太可读。


没错。异常应该很少被捕获。只有当你知道如何处理它们时才应该这样做。它们不是无缘无故被称为异常的。 - Mohnkuchenzentrale

1
B是我正在编写的库类。
如果您对B代码有控制权,则B应该重新抛出捕获的异常:
public class B
{
    public static string B_Method()
    {
        string bstr = String.Empty;

        try
        {
            // Do Something
        }
        catch(Exception e)
        {
            // Do Something (Log the exception details)
            throw;
        }

        return bstr;
    }
}

我希望类A和类B的各自方法能够以不同的方式处理在B_Method中发生的异常。
现在,B可以记录异常,而A和C可以以各自的方式处理重新抛出的异常。

这种重新抛出异常的方式非常不好。请使用完整堆栈调用throw;或创建新的自定义异常。 - Sergio Rykov

0

您可以重新抛出异常或者在B_Method方法中让其自行抛出,然后在类A和类C中捕获异常。

public class A
{
  public void A_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in A way
  }

}

public class C
{
 public void C_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in C way
  }
}

我认为设计模式在这里并不适用.. 这只是面向对象编程。


0
从类B中删除try和catch块。
public static string B_Method()throws Exception{
    boolean success=compute();
    if(!success){
       throw new Exception("an error occured");
     }
} 
private static boolean compute(){
    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接