Obsługa błędów - kopiowanie kodu

0

Witajcie

Mam problem odnośnie obsługi błędów w kodzie, który ma za zadanie pobrać plik z połączonego hosta i zapisać go u siebie. Kod wygląda tak:

if self.send_mode == 'ascii':
   try:
       new_server_file = open(path, 'r')
	   await self.save_file_content(new_server_file)
   except IsADirectoryError:
       dir_error_msg = b'remote: ' + path + ': Is a directory.')
       await self.loop.sock_sendall(self.control_conn, dir_error_msg)
   except PermissionError:
       permission_error_msg = b'remote: ' + path + ': Permission denied.'
       await self.loop.sock_sendall(self.control_conn, permission_error_msg)
   except FileNotFoundError:
       not_found_error_msg = b'remote: 550 ' + path + ': No such file or directory.'
       await self.loop.sock_sendall(self.control_conn, not_found_error_msg)
else:
    try:
        new_server_file = open(path, 'rb')
	    await self.save_file_content(new_server_file)
    except IsADirectoryError:
        dir_error_msg = b'remote: ' + path + ': Is a directory.')
        await self.loop.sock_sendall(self.control_conn, dir_error_msg)
    except PermissionError:
        permission_error_msg = b'remote: ' + path + ': Permission denied.'
	    await self.loop.sock_sendall(self.control_conn, permission_error_msg)
    except FileNotFoundError:
        not_found_error_msg = b'remote: 550 ' + path + ': No such file or directory.'
	    await self.loop.sock_sendall(self.control_conn, not_found_error_msg)

Jak widać w obsłudze błędów występuje kopiuj-wklej. Muszę obsłużyć wszystkie powyższe błędy, ale nie mam pojęcia jak zastąpić ten skopiowany kod. Czy może to tak zostać czy koniecznie muszę wymyślić coś żeby to poprawić?

0

Przede wszystkim, czym się różni tryb ascii od binarnego?

0
enedil napisał(a):

Przede wszystkim, czym się różni tryb ascii od binarnego?

W trybie ascii mają być przesyłane pliki tekstowe w postaci zakodowanych bajtów, natomiast w trybie binarnym te bajty zakodowane nie są. Obsługa wyjątku UnicodeDecodeError w przypadku kiedy ktoś spróbuje przesłać plik binarny w trybie ascii jest obsługiwana w innej metodzie.

0

Zrobiłem coś na wzór switcha w Pythonie i znacznie skróciłem kod. Oto on:

    def recv_file_error_handler(self, exception, path):
        handler =    {
		              'IsADirectoryError': b'remote: ' + path.encode() + b': Is a directory.\n',
			          'PermissionError': b'remote: ' + path.encode() + b': Permission denied.\n',
			          'FileNotFoundError': b'remote: 550 ' + path.encode() + b': No such file or directory.\n'
		             }
		
		return handler.get(exception)

    if self.send_mode == 'ascii':
        try:
	        new_server_file = open(path, 'w')
	        await self.save_file_content(new_server_file)
        except Exception as e:
	        error_msg = self.recv_file_error_handler(type(e).__name__, path)
	        await self.loop.sock_sendall(self.control_conn, error_msg)
    else:
        try:
            new_server_file = open(path, 'wb')
	        await self.save_file_content(new_server_file)
        except Exception as e:
	        error_msg = self.recv_file_error_handler(type(e).__name__, path)
	        await self.loop.sock_sendall(self.control_conn, error_msg)

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