Как я могу настроить пользовательские исключения в Java? - PullRequest
1 голос
/ 17 августа 2010

Это оригинальный код исключения

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());. Проблема возникает, когда в методе выбрасывается оригинал, потому что блок catch, установленный на NoValueForParametarWebServiceException, не перехватывает оригинал. Я знаю, что смогу поймать оригинал и просто перебросить новый (что тоже было бы удовлетворительно), но мне было интересно, есть ли другой способ.

РЕДАКТИРОВАТЬ: Кажется, что мне нужно, неясно, поэтому чтобы быть более ясным: Программа выбрасывает NoValueForParametarException. Я хочу поймать это, но использую метод toString() NoValueForParametarWebServiceException (это единственная причина создания нового класса), потому что мне нужен выходной формат новой версии без изменения старой.

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Я не вижу причин для подкласса вашего первого исключения. Кроме того, если вы избавляетесь от переменной экземпляра nestedException и используете вместо этого причину java.lang.Throwable, вам не нужно возиться с переопределением toString, и вы можете удалить большую часть этого кода.

0 голосов
/ 17 августа 2010

Проблема возникает, когда в методе выбрасывается оригинал, поскольку для блока 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, то будет переопределено метод toStue для вызываемого метода-объекта-класса, который будет вызван, вызывая метод ToString для объекта-вызова из класса.

Некоторые учебные пособия, связанные с исключениями:

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

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...