Python exception handling
Autor: Marco Minas | Publicado: 2013-10-27T16:14:00-07:00

The config file

[loggers]
keys=root

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=myFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=myFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=myFormatter
args=('logs/handling_error_sample.log', 'a', 4096, 2)

[formatter_myFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%m-%d %H:%M


The Python script

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''Acessa um recurso que gere uma Exception, faz o tratamento gravando o log do erro.'''

__author__ = 'Marco Antonio Almeida'
__version__ = '0.0.1'
__date__ = '27 out 2013'

import traceback
import exceptions
import xml.etree.ElementTree as et

# Inicializando componente de log.
import logging
import logging.config
import logging.handlers
logging.config.fileConfig('handling_error_sample.conf')
logger = logging.getLogger()
#

def read_file(fn):
    '''Retorna todo o conteudo de um arquivo. Problemas com acesso
    ou leitura do arquivo vai gerar erros'''
    retorno = None
    
    with open(fn) as f:
        retorno = f.read()
    
    return retorno
#end def

def obter_resposta_do_servidor():
    '''Obtem o XML e retorna um "xml.etree.ElementTree.Element" com
    o resultado.'''
    
    # Lendo o arquivo do disco
    file = '/etc/passwd'
    logger.debug('Lendo o arquivo ' + file)
    logger.info('Lendo o arquivo ' + file)
    response = read_file(file)
    logger.debug(response)
    # Tentanto converter o arquivo em XML
    logger.debug('Gerando um erro ao tentar transformar em XML')
    logger.info('Gerando um erro ao tentar transformar em XML')
    root = et.fromstring(response)
    logger.debug(type(root))
    
    return root
#end def

def aguardar_fim_processo():
    '''Faz um loop obtendo o resultado do servidor, aguardando que
    o status mude de "busy" para o de concluido.'''
    
    logger.info('Testes com tratamento de erro.')
    
    try:
        logger.info('Gerando erro ao obter dados do servidor')
        xml = obter_resposta_do_servidor()
        logger.info('Ops, algo deveria ter dado errado.')
        raise Exception('Erro em aguardar_fim_processo()', 'Deveria ter ocorrido um erro')
    
    except Exception as e:
        logger.info(type(e))
        logger.debug(type(e))
        logger.info(e.args)
        logger.debug(e.args)
        logger.info('Detalhes do erro:')
        logger.debug('Detalhes do erro:')
        trace = traceback.format_exc()
        logger.info('Erro aguardando resposta via traceback - detalhes do erro:\n' + trace)
        logger.debug('Erro aguardando resposta via traceback - detalhes do erro:\n' + trace)
        logger.info('Erro aguardando resposta via exc_info - detalhes do erro:\n', exc_info=True)
        logger.debug('Erro aguardando resposta via exc_info - detalhes do erro:\n', exc_info=True)
        raise e
    
    else:
        raise Exception('Erro em aguardar_fim_processo()', 'Deveria ter ocorrido um erro')
#end def

def main():
    '''Executa as operacoes necessarias para leitura de xml'''
    
    logger.info('Iniciando processo.')
    
    try:
    
        # Faz a leitura de um XML
        result = aguardar_fim_processo()
        logger.info(result)
    
    except Exception as e:
    
        logger.debug("Erro aguardando resposta, traceback =", exc_info=True)
#end def

# Executando a aplicacao.
if __name__ == '__main__':
    main()
#end def