2016-12-05 5 views
0

Ich habe Klasse namens ExcelFile, seine Aufgabe ist es, Excel-Dateien zu verwalten (lesen, extrahieren Daten und verschiedene Dinge für den Stapel).Verwalten von Ausnahmen Handhabung

Ich möchte ein System für die Verwaltung von Fehlern/Ausnahmen implementieren.

Zum Beispiel Excelfile als Methode load(), wie ein "setup"

def load(self): 
     """ 
      Setup for excel file 
      Load workbook, worksheet and others characteristics (data lines, header...) 
      :return: Setup successfully or not 
      :rtype: bool 

      Current usage 
      :Example: 

      > excefile = ExcelFile('test.xls') 
      > excefile.load() 
       True 
      > excefile.nb_rows() 
       4 
     """ 
     self.workbook = xlrd.open_workbook(self.url) 
     self.sheet = self.workbook.sheet_by_index(0) 
     self.header_row_index = self.get_header_row_index() 

     if self.header_row_index == None: # If file doesn't have header (or not valid) 
      return False 

     self.header_fields = self.sheet.row_values(self.header_row_index) 
     self.header_fields_col_ids = self.get_col_ids(self.header_fields) # Mapping between header fields and col ids 
     self.nb_rows = self.count_rows() 
     self.row_start_data = self.header_row_index + self.HEADER_ROWS 
     return True 

Wie Sie sehen können, habe ich 2 differents Fehler auftreten können:

  1. Die Datei ist keine Excel-Datei (raise xlrd.XLRDError)
  2. Die Datei hat einen ungültigen Header (also gebe ich False zurück)

Ich möchte ein gutes Management-System von ExcelFile-Fehlern implementieren, da diese Klasse viel im Stapel verwendet wird.

Dies ist meine erste Idee für Verarbeitung, die:

Implementieren einer Standard Ausnahme

class ExcelFileException(Exception): 

    def __init__(self, message, type=None): 
     self.message = message 
     self.type = type 

    def __str__(self): 
     return "{} : {} ({})".format(self.__class__.__name__, self.message, self.type) 

Rewrite Load-Methode

def load(self): 
    """ 
     Setup for excel file 
     Load workbook, worksheet and others characteristics (data lines, header...) 
     :return: Setup successfully or not 
     :rtype: bool 

     Current usage 
     :Example: 

     > excefile = ExcelFile('test.xls') 
     > excefile.load() 
      True 
     > excefile.nb_rows() 
      4 
    """ 
    try: 
     self.workbook = xlrd.open_workbook(self.url) 
    except xlrd.XLRDError as e: 
     raise ExcelFileException("Unsupported file type", e.__class__.__name__) 

    self.sheet = self.workbook.sheet_by_index(0) 
    self.header_row_index = self.get_header_row_index() 

    if self.header_row_index == None: # If file doesn't have header (or not valid) 
     raise ExcelFileException("Invalid or empty header") 

    self.header_fields = self.sheet.row_values(self.header_row_index) 
    self.header_fields_col_ids = self.get_col_ids(self.header_fields) # Mapping between header fields and col ids 
    self.nb_rows = self.count_rows() 
    self.row_start_data = self.header_row_index + self.HEADER_ROWS 
    return True 

Und dies ist ein Beispiel in einem Rufmethode, ein großes Problem Muss ich ein Diktat namens "Bericht" mit Fehlern in Französisch, für Kundenerfolg und andere verwalten.

... 
def foo(): 
    ... 
    file = ExcelFile(location) 

    try: 
     file.load() 
    except ExcelFileException as e: 
     log.warn(e.__str__()) 
     if e.type == 'XLRDError' 
      self.report['errors'] = 'Long description of the error, in french (error is about invalid file type)' 
     else: 
      self.report['errors'] = 'Long description of the error, in french (error is about invalid header)' 
... 

Was denken Sie darüber? Hast du einen besseren Weg? Danke

Antwort

1

Sie Ihre Ausnahme ändern könnte die Fehler in Ihrem dict zu protokollieren:

class ExcelFileException(Exception): 

    def __init__(self, message, report, type=None): 
     report['errors'].append(message) 
     self.message = message 
     self.type = type 

    def __str__(self): 
     return "{} : {} ({})".format(self.__class__.__name__, self.message, self.type) 

Wenn Sie raise ein exception:

raise ExcelFileException("Invalid or empty header", report) 

Die Fehler in self.dictionnary['errors']

vorhanden sein wird
+0

Vielen Dank, aber ich habe eine Bedingung: 1) Die Meldung im Bericht in französisch und sehr explizit sein muss (für den Erfolg unserer Kunden und andere Mitglieder des Teams) – Alexandre

+0

Und ist nicht ein guter wat, etwas wie das zu tun:'Alff ExcelFileException ("Fehlermeldung", "französische Beschreibung") ' – Alexandre

+0

Wenn Sie die Fehlermeldungen irgendwo gespeichert haben, konnten Sie ein' dict' mit einer Beschreibung auf französisch für verwenden die Fehlermeldung, etwas wie 'Bericht ['Fehler']. append (your_dict_with_french_descriptions [Nachricht])' – user312016