Técnicas: Tratamento de Exceções, Depuração e Logging

Tratamento de Exceções

Usar Checked Exceptions ou Unchecked Exceptions?

A favor de usar Checked Exceptions

A favor de usar Unchecked Exceptions

Recomendações de especialistas (Johnson) sobre Checked versus Unchecked

Práticas adicionais sobre exceções

Depuração e Logging

Exemplo com a API Java

// usar o nome da classe dá muita flexibilidade para dizer o que será logado
Logger logger = getLogger(getClass().getName());
// ...
logger.fine("Achei erro no elemento <" +
            elementNumber + ">: valor fora de faixa");
# Specify the handlers to create in the root logger
# (all loggers are children of the root logger)
# The following creates two handlers
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
    
# Set the default logging level for the root logger
.level = ALL
    
# Set the default logging level for new ConsoleHandler instances
java.util.logging.ConsoleHandler.level = INFO
    
# Set the default logging level for new FileHandler instances
java.util.logging.FileHandler.level = ALL
    
# Set the default formatter for new ConsoleHandler instances
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
# Loggers
# ------------------------------------------
# Loggers are usually attached to packages.
# Here, the level for each package is specified.
# The global level is used by default, so levels
# specified here simply act as an override.
myapp.ui.level=ALL
myapp.business.level=CONFIG
myapp.data.level=SEVERE 

Exemplo com a API log4j

public class SageFileTopologyBuilder extends CHESFTopologyBuilder {
    static Logger logger = Logger.getLogger(SageFileTopologyBuilder.class
            .getName());
// ...
    public void buildTopology() throws IOException, TopogiggioException {
        rootRegion = new Region(Element.TYPE_REGION,
                Element.SUBTYPE_REGION_SYSTEM, "CHESF");
        logger.debug("buildTopology");
        // table processing order is important
        logger.debug("process INS");
        process_INS_Table(rootRegion);
        logger.debug("process EST");
        process_EST_Table(rootRegion);
        logger.debug("process PDS");
        process_PDS_Table(rootRegion);
        logger.debug("process LIG");
        process_LIG_Table(rootRegion);
        logger.debug("process CNC");
    }
    private void process_TR2_Table(Region rootRegion) throws IOException,
            TopogiggioException {
        List table = loadTR2Table();
        for (int i = 0; i < table.size(); i++) {
            ItemTR2 item = (ItemTR2) table.get(i);
            if (skipID(item.id)) {
                continue;
            }
            // avoid creating several transformers for parallel
            // transformers
            String id = canonicalTransformerName(item.id);
            logger.debug("adding 2-winding transformer <" + id + ">");
            if (Convert.getInstance().getElement(id) == null) {
                Substation substation = getSubstationFromStation(item.primary);
                if (substation == null) {
                    throw new TopogiggioException(
                            "TR2 com PRIM estranho (sem subestacao)(" + item.id
                                    + ")");
                }
                String nodeID1;
                String nodeID2;
                if (item.primary.equals(item.secondary)) {
                    // caso especial de transformadores ficticios
                    nodeID1 = getConnection(item.id, item.primary, 0);
                    nodeID2 = getConnection(item.id, item.secondary, 1);
                } else {
                    nodeID1 = getConnection(item.id, item.primary, 0);
                    nodeID2 = getConnection(item.id, item.secondary, 0);
                }
                if (nodeID1 == null || nodeID2 == null) {
                    throw new TopogiggioException("TR2 sem 2 conexoes("
                            + item.id + ")");
                }
                logger.debug("adding transformer, nodes " + nodeID1 + ", "
                        + nodeID2);
                Element newElement = substation.addTransformer(id, nodeID1,
                        nodeID2, "");
                aNewElement(newElement);
            }
        }
    }
}
# Set root category priority to DEBUG and its only appender to A1.
log4j.rootCategory=DEBUG, A1

#log4j.appender.A1=org.apache.log4j.ConsoleAppender
#log4j.appender.A1.target=System.err
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.file=topogiggio.log
log4j.appender.A1.append=false

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Configure topogiggio log level here
#log4j.logger.topogiggio.Auditor=DEBUG
#log4j.logger.topogiggio.Convert=DEBUG
#log4j.logger.topogiggio.bo.AbstractElement=DEBUG
#log4j.logger.topogiggio.bo.ElementOneNode=DEBUG
#log4j.logger.topogiggio.bo.ElementTwoNodes=DEBUG
#log4j.logger.topogiggio.bo.Generator=DEBUG
#log4j.logger.topogiggio.bo.Line=DEBUG
#log4j.logger.topogiggio.bo.Node=DEBUG
#log4j.logger.topogiggio.bo.Region=DEBUG
#log4j.logger.topogiggio.bo.Substation=DEBUG
#log4j.logger.topogiggio.bo.Transformer=DEBUG
#log4j.logger.topogiggio.bo.Winding=DEBUG
#log4j.logger.topogiggio.bo=DEBUG
#log4j.logger.topogiggio.Convert=DEBUG
#log4j.logger.topogiggio.test.TestConvert=DEBUG
#log4j.logger.topogiggio.TopogiggioFacade=DEBUG
#log4j.logger.topogiggio.topology.MDRSageTopologyBuilder=DEBUG
#log4j.logger.topogiggio.topology.SageFileTopologyBuilder=DEBUG
#log4j.logger.topogiggio.visitor.AbstractVisitor=DEBUG
#log4j.logger.topogiggio.visitor.BusVisitor=DEBUG
#log4j.logger.topogiggio.visitor.classifiers.AbstractClassifierVisitor=DEBUG
#log4j.logger.topogiggio.visitor.GeneratorVisitor=DEBUG
#log4j.logger.topogiggio.visitor.HandleFictitiousLinesVisitor=DEBUG
#log4j.logger.topogiggio.visitor.HandleLinksVisitor=DEBUG
#log4j.logger.topogiggio.visitor.LineVisitor=DEBUG
#log4j.logger.topogiggio.visitor.ReactorVisitor=DEBUG
#log4j.logger.topogiggio.visitor.RemoveFictitiousLinesVisitor=DEBUG
#log4j.logger.topogiggio.visitor.ShortCircuitVisitor=DEBUG
#log4j.logger.topogiggio.visitor.ShortCircuitLinksVisitor=DEBUG
#log4j.logger.topogiggio.visitor.SubstationLinkVisitor=DEBUG
#log4j.logger.topogiggio.visitor.TransformerVisitor=DEBUG
#log4j.logger.topogiggio.visitor.VisitResult=DEBUG
#log4j.logger.topogiggio=DEBUG
log4j.logger.topogiggio=INFO

Logging e desempenho

   if(logger.isLoggable(Level.FINE)) {
      logger.fine("O estado do objeto eh: " + metodoQueCustaCaro());
   }

tecnicas-1 programa