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 中发生的异常。

我寻找框架设计模式,但觉得没有用。

4

4 回答 4

9

我通常遵循的方法是这样的:

  • 如果我的方法可以对异常做一些有用的事情,我会抓住它并这样做。
  • 如果没有,我不会抓住它,而是让调用代码来处理它。

我将放置“全部捕获”块的唯一地方是 UI 代码的入口点(例如按钮单击的事件处理程序等),因为不捕获异常可能会导致进程停止。

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

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

于 2012-12-14T11:22:28.463 回答
1

B 是我正在编写的库类。

如果您可以控制B代码,B是否应该重新throw捕获异常:

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处理重新抛出的异常是他们自己的方式。

于 2012-12-14T11:25:57.847 回答
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
  }
}

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

于 2012-12-14T11:23:15.387 回答
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;
}
于 2012-12-14T11:26:34.360 回答