2010-10-16 87 views
1
final class DBGlobalsException extends Exception 
{ 
   String mistake; 

   //where this is shorthand for chained constructors that look like Exception 
   DBGlobalsException(String message, Throwable cause) 
   { 
     super(message,cause); 
   } 

   // elaborate your exception with whatever error state you want to propagate outwards 
   void setField(mistake) { 

    } 
} 

catch (IOException ex) { 
   DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage()); 
   msg = "Unable to save data"; 
   status = false; 
   DBGlobalsException dbe = new DBGlobalsException(msg,ex); 
   dbe.setField(status); 
   throw dbe; 
} 

处理这个职位代码是从我以前的帖子采取...自定义异常在Java中

https://stackoverflow.com/users/recent/454848

请纠正我,如果我错了......

  1. 是什么setField方法呢?我们需要一个吗?
  2. 扔dbe会抛出我的期望和消息被追加。
  3. 链式结构是什么意思,就像有多个构造函数一样。
+0

的描述我想你错过了一些我张贴反对这个代码前面的评论......你不*需要*'setField()'明确,我只是包括,要指向嵌入的方式无论您需要处理它的“Exception”中的状态/错误状态。建议你看看我留在我的答案早前问题的意见... – andersoj 2010-10-16 22:49:39

+0

阅读有关此链接Exception'的'细节:http://download.oracle.com/javase/6/docs/api/java/lang /Throwable.html – andersoj 2010-10-16 22:56:21

回答

1

1)setField方法做了什么? 我们需要一个。

setField()方法是我在previous question中介绍的一种方法,向您展示如何将新状态添加到异常。由于我不知道应用程序的具体情况,因此我不知道需要传播哪些特定信息。在这里,它可能足以知道在封面下出了什么问题,并且应该将IOException或其他任何东西作为自定义异常中的“原因”。

2)throw dbe会给我带来期待和被附加的信息。

是的,throw dbe抛出新的链接异常。如果你没有看到它,是的,来自两者的消息将被附加到结果堆栈跟踪中。如Throwable API中所述,您可以自定义如何显示/组成“消息”。

3)链式结构是什么意思,是否有多个构造函数。

正如在另一个答案中指出的那样,链式构造函数只是指调用其他构造函数的构造函数。在Throwable子类的情况,但是,也有为了提供给连锁例外,它给你一个标准的机制来“包装”外例外,更适合您的代码的抽象层次,底层异常具体的超类的构造函数。看到Throwable API

+0

setField方法的好处被使用,并且将我扔DBE抛出此setField方法值太.. – John 2010-10-16 23:23:06

+0

@约翰:不知道如果我正确地分析您的评论,但我给它一个去:的好处将状态添加到自定义异常 - 即添加自定义字段并允许您使用setField()来设置 - 可以将状态/错误信息传播到外部作用域以捕获异常。这避免了需要通过其他方式明确地传递错误或状态。是的,如果您在'dbe'实例上调用'setField(something)',那么捕获异常的代码将能够看到它 - 您可能需要为此添加一个'DBGlobalsException.getField()'方法。 – andersoj 2010-10-16 23:33:18

1

链式构造函数意味着您有一个构造函数,它接受您可能发送的所有“可能”参数,而其他所有构造函数都会简单地调用(链)到这个参数。它们通常为某些参数提供默认值。 所有逻辑都需要在主/链接构造函数中完成,因此代码不会重复。

public class Movie { 
    private String title; 
    private String rating; 

    public Movie() { 
    this("G"); // calls-chains -- to main defualt constructor - note the default value passed 
    } 
    public Movie(String newRating) { 
    rating = newRating; 
    } 
} 

至于错误 - 如果setfield接受字符串值并设置错误字符串,那么是的,这是必要的。如果消息与错误字符串是一样的,那么不是,你可以通过构造函数设置它。

1
  1. 看来你只贴实际的代码,从它不可能说什么setField做的部分。它可能只是设置了mistake字段,并且假设有类似的getField方法,则可以在需要时在别处检索它。

  2. throw dbe;正如它所说的那样:它会抛出dbe对象,它隐含地包含消息和类中声明的任何其他字段。

  3. 通过构造函数链接,你指的是super(message,cause); 行吗?如果是这样,那只需调用超类(Exception)的构造函数。基本上,构造函数没有什么特别的,所以它只是将其参数转发给超类。


编辑:从什么@andersoj在评论中提及,似乎他真正的意思在以前的答案是“异常链”,这是无关的一般构造。异常链接基本上可以让你将异常链接到导致它的另一个异常。在您的示例中,响应IOException引发DBGlobalsException,因此在创建dbe时,通过将ex作为cause自变量进行响应,您设置了一条链接,指出“ex导致dbe”。当您稍后捕获dbe时,可以使用getCause()获取链接的例外,即ex

+0

的链接在这里发生异常的“特殊”的链接行为,这样的基本条件不丢失(我是约翰的早期的岗位提出的观点)的优势,如果传播出来显示在堆栈跟踪,并可以使用'getCause()'方法或任何其他方法... – andersoj 2010-10-16 22:52:31

+0

@andersoj:我明白你的意思;这更恰当地称为“异常链接”,这与“构造链接”完全无关。 – casablanca 2010-10-16 22:59:27