Newsgroup: it.comp.java
Titolo: [?] Facile (spero) dubbio sull'eccezioni

Salve,
    vorrei creare un classe che erdedita la classe Exception e
    *overridare* il metodo toString, facendogli ritornare il nome
    della classe e il metodo che ha generato l'eccezione. Esiste
    un modo elegante per fare cio'?
Grazie.

ciao Kill, 
eccoti la classe base che sto uso nel progetto che sto facendo.
è forse un po elaborata, ma consente di rimandare a chi trappa
l'eccezione anche l'eccezione originale.
...spero di essere stato di aiuto.
Carlo.B...@inetconsulting.it
--------------------------------
package exception.Common;
import java.util.StringTokenizer;
/**
 * Title:
 * Description:
 * Copyright:    Copyright (c) 2001
 * Company:
 * @author
 * @version 1.0
 */
public class CBaseX extends Exception {
  // classe che ha generato
  private Class classe;
  // metodo che ha generato
  private String metodo;
  // codice d'errore
  private CCodeX codice;
  /**
   * eccezione innestata (per generare la propria eccezione e
rimandare anche la causa)
   * es:
   * <code><pre>
   * try {
   *   <em>... qualcosa ...</em>
   * }
   * catch (Exception e) {
   *   try new <em>NostraEccezione</em>(this.getClass(),"metdodo",
CCodeX.Errore, e);
   * }
   * </pre></code>
   * chi cattura può conoscere l'eccezione innestata
   */
  private Exception next;
  /**
   * parametro inizializato con un messaggio variabile.
   * es: nel messaggio "Entity Non trovato" custom contiene il nome
dell'entity
   * Nel costruttore se il msg NON ha il dato variabile custom va
valorizzata a null
   *
   * Esempi:
   * <code><pre>
   *   new CBaseX (this.getClass(), "getDocTypeHome()", null,
I_CONTESTONONVALIDO);
   *   new CBaseX (this.getClass(), "getDocTypeHome()",
JNDI_E_DOCTYPE, G_ENTITYNONTROVATO);
   * </pre></code>
   */
  final private String custom;
  public CBaseX( Class classe, String metodo, int code ) {
    super(getExtendedMessage(classe, metodo, code));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = new CCodeX(code);
    this.next = null;
    this.custom = null;
  }
  public CBaseX( Class classe, String metodo, int code, String custom
) {
    super(getExtendedMessage(classe, metodo, code, custom));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = new CCodeX(code);
    this.next = null;
    this.custom = custom;
  }
  public CBaseX( Class classe, String metodo, int code, Exception next
) {
    super(getExtendedMessage(classe, metodo, code, next));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = new CCodeX(code);
    this.next = next;
    this.custom = null;
  }
  public CBaseX( Class classe, String metodo, int code, String custom,
Exception next ) {
    super(getExtendedMessage(classe, metodo, code, custom, next));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = new CCodeX(code);
    this.next = next;
    this.custom = custom;
  }
  public CBaseX( Class classe, String metodo, CCodeX code ) {
    super(getExtendedMessage(classe, metodo, code));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = code;
    this.next = null;
    this.custom = null;
  }
  public CBaseX( Class classe, String metodo, CCodeX code, String
custom ) {
    super(getExtendedMessage(classe, metodo, code, custom));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = code;
    this.next = null;
    this.custom = custom;
  }
  public CBaseX( Class classe, String metodo, CCodeX code, Exception
next ) {
    super(getExtendedMessage(classe, metodo, code, next));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = code;
    this.next = next;
    this.custom = null;
  }
  public CBaseX( Class classe, String metodo, CCodeX code, String
custom, Exception next ) {
    super(getExtendedMessage(classe, metodo, code, custom, next));
    this.classe = classe;
    this.metodo = metodo;
    this.codice = code;
    this.next = next;
    this.custom = custom;
  }
  public final String getExtendedMessage() {
    return( formatMessage(classe, metodo, codice.getCode(), custom,
next) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, int code) {
    return( formatMessage(classe, metodo, code, null, null) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, CCodeX code) {
    return( formatMessage(classe, metodo, code.getCode(), null, null)
);
  }
  public final static String getExtendedMessage(Class classe, String
metodo, int code, String custom) {
    return( formatMessage(classe, metodo, code, custom, null) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, CCodeX code, String custom) {
    return( formatMessage(classe, metodo, code.getCode(), custom,
null) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, int code, Exception next ) {
    return( formatMessage(classe, metodo, code, null, next) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, CCodeX code, Exception next ) {
    return( formatMessage(classe, metodo, code.getCode(), null, next)
);
  }
  public final static String getExtendedMessage(Class classe, String
metodo, int code, String custom, Exception next ) {
    return( formatMessage(classe, metodo, code, custom, next) );
  }
  public final static String getExtendedMessage(Class classe, String
metodo, CCodeX code, String custom, Exception next ) {
    return( formatMessage(classe, metodo, code.getCode(), custom,
next) );
  }
  private final static String formatMessage(Class classe, String
metodo, int code, String custom, Exception next ) {
    // se si cambia il formato, anche decode(...) va cambiata!
    // vecchia formattazione
    //return( "[" + Integer.toString(code) + "] " + classe.getName() +
"." + metodo + ": " + CCodeX.getMsg(code) + (custom == null ? "": " #
" + custom + " # ") + (next == null ? "": " Next: " +
next.getMessage() ) );
    return( "[" + Integer.toString(code) + "] " + classe.getName() +
"." + metodo + ": " + CCodeX.getMsg(code) + (custom == null ? "": " #
" + custom + " # ") + (next == null ? "": "\n\tNext: " +
next.getMessage() ) );
  }
/*
  public final static int decode(String message) {
    StringTokenizer st = new StringTokenizer(message, "[]");
    String  sCode;
    int ret = CCodeX.iErrore;
    try {
      sCode = st.nextToken();
      ret = Integer.valueOf(sCode).intValue();
    }
    catch (Exception e) {
      ret = CCodeX.iArgomentiErrati;
    }
    return( ret );
  }
  public final String toString() {
    return codice.getMsg();
  }
*/
  /**
   * @return    La classe che ha sollevato l'eccezione
   */
  public Class getClasse() {
    return classe;
  }
  /**
   * @return    Il metodo che ha sollevato l'eccezione
   */
  public String getMetodo() {
    return metodo;
  }
  /**
   * @return    Codice d'errore
   * @see       exception.Common.CCodeX
   */
  public CCodeX getCodice() {
    return codice;
  }
  /**
   * @return    Messaggio d'errore aggiuntivo
   */
  public String getCustomMessage() {
    return custom;
  }
  /**
   * @return    Eccezione innestata o <code>null</code>
   */
  public final Exception getNext() {
    return next;
  }
  /**
   * @return    Eccezione innestata solo se e' una sottoclasse di
<code>CBaseX</code>, altrimenti <code>null</code>
   */
  public final CBaseX getNextAsCBaseX() {
    return( next instanceof CBaseX ? (CBaseX) next : null );
  }
}
-------------------------------
