如何在Java中自定义自定义异常?

时间:2010-08-17 17:21:05

标签: java exception

这是原始的异常代码

public class NoValueForParametarException extends Exception {

private Exception nestedException;
 private int errorCode;

 public NoValueForParametarException(String message) {
  super(message);
 }

 public NoValueForParametarException(Exception ex,String message) {
  super(message);
  this.nestedException = ex;
 }

 public NoValueForParametarException(String message, int errorCode) {
  super(message);
  this.setErrorCode(errorCode);
 }

 public Exception getNestedException() {
  return this.nestedException;
 }

 public void setNestedException(Exception nestedException) {
  this.nestedException = nestedException;
 }

 public int getErrorCode() {
  return this.errorCode;
 }

 public void setErrorCode(int errorCode) {
  this.errorCode = errorCode;
 }

 public String toString() {
  StringBuffer errorMsg = new StringBuffer();
  errorMsg.append("[" + super.getMessage() + "]:");
  errorMsg.append((this.nestedException != null) ? ("\n[Nested exception]:" +   this.nestedException):"");
  return errorMsg.toString();
 }
}

这是新的

public class NoValueForParametarWebServiceException extends NoValueForParametarException {

 public NoValueForParametarWebServiceException(String message) {
  super(message);
 }

 public NoValueForParametarWebServiceException(Exception ex,String message) {
  super(message);
  this.setNestedException(ex);
 }

 public NoValueForParametarWebServiceException(String message, int errorCode) {
  super(message);
  this.setErrorCode(errorCode);
 }

 public String toString() {
  StringBuffer errorMsg = new StringBuffer();
  errorMsg.append(super.getMessage());
  errorMsg.append((this.getNestedException() != null) ?   ("\n[Nested     exception]:" + this.getNestedException()):"");  
  return errorMsg.toString();
 }
}

我需要的是更改toString()方法的部分,而不是errorMsg.append("[" + super.getMessage() + "]:");我有errorMsg.append(super.getMessage());。当在方法中抛出原始文件时会出现问题,因为设置为NoValueForParametarWebServiceException的catch块不会捕获原始文件。我知道我可以抓住原版并重新抛出新版本(这也很令人满意),但我想知道是否还有其他方法。

编辑:看来我需要的是不清楚的,所以要更清楚: 该程序抛出NoValueForParametarException。我想抓住它,但使用toString()的{​​{1}}方法(这是创建新类的唯一原因),因为我需要新版本的输出格式而不更改旧版本。

2 个答案:

答案 0 :(得分:1)

我认为没有任何理由继承您的第一个例外。此外,如果你摆脱了nestedException实例变量并使用java.lang.Throwable的原因,你不必乱用重写toString,你可以删除大部分代码。

答案 1 :(得分:0)

  

在某种方法中出现问题   因为原来被扔了   catch块设置为   'NoValueForParametarWebServiceException'   没有赶上原来的。我知道我   可以捕捉原始和公正   重新抛出新的(也会   满意)

您不需要重新抛出子异常。 在这种情况下,只需捕获父异常。

try{
  //your code
}catch(NoValueForParametarException e){
  //whatever handling you need to do. suppose you call toString() method
  System.out.println(e.toString());
}

在上面的情况下,如果抛出任何异常,将执行catch块 (NoValueForParametarException或NoValueForParametarWebServiceException)。

根据抛出的异常,将调用其toString()方法。 (简单继承规则)即

  • NoValueForParametarException是 抛出toString定义 NoValueForParametarException类 例如,将被召集。
  • 如果 NoValueForParametarWebServiceException 抛出然后重写toString 方法来自 NoValueForParametarWebServiceException 将被召集。

一些与例外相关的教程:

http://download.oracle.com/javase/tutorial/essential/exceptions/index.html

http://tutorials.jenkov.com/java-exception-handling/index.html

希望这有帮助。