Как настроить пользовательские исключения в Java?

Это исходный код исключения

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

Ответ 1

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

Ответ 2

Проблема возникает, когда в методе, оригинал бросается, потому что блок 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

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