11 PEP 293: Rejestrowanie kodu obsługi błędów przy przekodowywaniu

Podczas konwersji napisu Unicode na napis bajtowy napotkane mogą zostać znaki, których zakodowanie w nowym napisie jest niemożliwe. Dotychczas Python pozwalał na określenie sposobu obsługi tego typu sytuacji poprzez wybór jednej z trzech możliwości, nazwanych odpowiednio: "strict" (wygenerowanie wyjątku UnicodeError), "ignore" (pominięcie znaku) lub "replace" (zastąpienie znaku znakiem zapytania), przy czym domyślnym ustawieniem było "strict". Przydatna może być jednak możliwość określenia alternatywnego sposobu obsługi błędu, polegającego na przykład na wstawieniu odwołania znakowego w XML-u czy też odwołania do encji w HTML-u.

Obecnie Python oferuje elastyczny mechanizm, który pozwala na implementowanie i dodawanie nowych strategii przekodowywania napisów oraz obsługi błędów podczas tych operacji. Nowe funkcje obsługi błędów można dodawać poprzez wywołanie codecs.register_error. Obiekty kodujące mogą wówczas uzyskać dostęp do funkcji obsługującej błąd poprzez codecs.lookup_error. Dla obiektów kodujących napisanych w języku C dodano również odpowiednie API. Funkcja obsługująca błąd może uzyskać potrzebne informacje na temat stanu konwersji, m.in. konwertowany napis, pozycję na której wykryto błąd oraz kodowanie docelowe. Podjętym działaniem może być wygenerowanie wyjątku lub zwrócenie odpowiedniego napisu zastępującego błędny znak.

Przy użyciu nowego mechanizmu zaimplementowano dwie dodatkowe strategie obsługi błędu: "backslashreplace" zapisuje kłopotliwe znaki korzystając ze standardowego pythonowego mechanizmu cytowania, zaś "xmlcharrefreplace" umieszcza w napisie docelowym XML-owe odwołanie do znaku.

Zobacz też:

PEP 293, Rejestrowanie kodu obsługi błędów przy przekodowywaniu
Autor dokumentu PEP i implementacji: Walter Dörwald.

Zajrzyj do Informacji na temat tej publikacji... aby pomóc w jej rozwoju.