Rady w temacie obsługi błędów.

0

Cześć,

Nie mam doświadczenia w konstrukcji dużych aplikacji i chciałbym się was poradzić, jak postępować z obsługą błędów. Wolę tego typu informacje uzyskiwać na przykładach, zatem podam fragmenty kodu przy których mam mega wątpliwości.

Funkcja load_keymap jest z modułu keymap, a jej treść jest następująca:

def load_keymap():
    """Funkcja wczytujaca odwzorowanie skrotow klawiszowych na instrukcje."""
    keymap = {}

    for line in all_lines( mapping.config( 'keymap' ) ):
        try:
            shortcut, statement = split_strip( '=', line )
            keymap[ shortcut ] = statement
        except ValueError:
            raise ValueError( 'Błędny wpis w konfiguracji klawiszy: %s' % ( line ) )

    return keymap

Moduł window zawiera klasę Window, która ma metodę init_keymap, jej treść jest następująca:

def init_keymap( self ):
    """Inicjalizacja słownika skrotow klawiszowych na instrukcje."""
    try:
        self.keymap = load_keymap()
    except Exception as e:
        raport_error( str( e ) )
        sys.exit()

Zaraz po skojarzeniu pliku konfiguracji dochodzi do odczytu wszystkich linii. Jeśli plik będzie przypadkowo usunięty to python wywali exception o treści "No such file or directory ..." i tak zastawia mnie to co w tej sytuacji byłby lepsze. Czy samodzielna próba reanimacji danej sytuacji, czyli utworzenie niezbędnych katalogów, plików po to by później nic nie wczytać (A jeśli tak, to w którym pliku powinno to się odbywać?). Czy może sam proces wczytania wszystkich linii otoczyć klauzulą try..except i później wypuść wyjątek o treści przeznaczonej dla usera końcowego, np. "Utwórz plik 'filename' i uzupełnij plik ręcznie o swoje konfiguracje klawiszowe"?

Zastanawia mnie też czy kod gdzie mam except ValueError i raise ValueError jest karygodny. W końcu pewne błędy chciałbym userowi uświadomić zamiast chować to do logu. Czy takie tłumaczenie błędu technicznego na zrozumiały jest powszechna praktyka? A jeśli nie to jak wy to robicie?

Na razie chciałbym z wami porozmawiać na temat powyższego kodu, jeśli rozmowa będzie miała sens to skuszę się przedstawić kolejne fragmenty nad którymi się głowię.

Dzięki za uwagę. Liczę na powagę z waszej strony.

0
def build_default_keymap():
    """Tworzy domyslny uklad skrotow klawiszowych na instrukcje."""
    default_keymap = {
        'F1' : 'help',
        'C-S' : 'save_by_user',
        'CS-S' : 'save_as_by_user',
        'C-N' : 'new_file',
        'C-O' : 'open_file_by_user'
    }

    return default_keymap

def load_keymap():
    """Funkcja wczytujaca odwzorowanie klawiszy na instrukcje."""
    keymap = {}

    try:
        lines = all_lines( mapping.config( 'keymap' ) )
    except IOError:
        return build_default_keymap()

    for line in lines:
        try:
            shortcut, statement = split_strip( '=', line )
            keymap[ shortcut ] = statement
        except ValueError:
            raise ValueError( 'Błędny wpis w konfiguracji klawiszy: %s' % ( line ) )

    return keymap

Czy wobec tego kodu są uwagi?

0

A teraz wersja z zawierająca domyślny zapis klawiszy:

def build_default_keymap():
    """Tworzy domyslny uklad skrotow klawiszowych na instrukcje."""
    default_keymap = {
        'F1' : 'help',
        'C-S' : 'save_by_user',
        'CS-S' : 'save_as_by_user',
        'C-N' : 'new_file',
        'C-O' : 'open_file_by_user'
    }

    return default_keymap

def save_keymap( keymap ):
    lines = map( lambda item: '%s = %s' % ( item ), keymap.items() )
    open( mapping.config( 'keymap' ), 'w' ).writelines( lines )

def load_keymap():
    """Funkcja wczytujaca odwzorowanie klawiszy na instrukcje."""
    keymap = {}

    try:
        lines = all_lines( mapping.config( 'keymap' ) )
    except IOError:
        default_keymap = build_default_keymap()

        try:
            save_keymap( default_keymap )
        except IOError:
            pass

        return default_keymap

    for line in lines:
        try:
            shortcut, statement = split_strip( '=', line )
            keymap[ shortcut ] = statement
        except ValueError:
            raise ValueError( 'Błędny wpis w konfiguracji klawiszy: %s' % ( line ) )

    return keymap

Co powinienem zrobić tam, gdzie spasowałem? raport_log( "cannot read and write keymap config" ) ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1