Chciałbym znaleźć sposób na wychwycenie błędów podczas uruchamiania mojego pliku init, a następnie z gracją sobie z nimi poradzić. Wiele moich najważniejszych dostosowań i skrótów klawiszowych pojawia się na końcu mojego pliku init, aby upewnić się, że inne ustawienia nie zostaną zastosowane ponad nimi. Problem polega na tym, że gdy inicjalizacja przerywa się wcześnie, czuję się całkowicie kaleką, próbując rozwiązać problem bez zastosowania moich znanych powiązań klawiszy i ustawień.
Czy jest jakiś sposób, aby z wdziękiem zakończyć proces inicjalizacji, gdy wystąpi błąd?
źródło
with-demoted-errors
. Możesz dodać do niej argument łańcuchowy"LOOK OVER HERE!!! %s"
, więc mniej prawdopodobne jest pominięcie błędu w buforze komunikatów.with-demoted-errors
jest dostępna tylko w 24.4@Dan dobrze opisał, jak zamieniać błędy w wiadomości. Za pomocą błędów możesz także robić, co chcesz, z błędami
condition-case
. Jeszcze inną opcją jest użycieunwind-protect
.Będę się
condition-case
tutaj trzymał , bez żadnego powodu.Łapanie błędu
To zawsze powinno gwarantować, że kluczowe definicje zostaną ocenione, niezależnie od tego, co wydarzyło się w środku
condition-case
. Każdy błąd zostanie zapisany w środkuinit-error
.Odrzucając to z powrotem
Następnie ponownie rzuć błąd. Możesz to zrobić na kilka sposobów, oto jeden.
źródło
unwind-protect
powoduje natychmiastowe ponowne zgłoszenie błędu po wykonaniu dowolnego kodu umieszczonego w jego klauzuli ratunkowej. To jest jakfinally
w języku takim jak Javacatch
.Inne odpowiedzi dość dobrze obejmowały niskopoziomowe narzędzia do obsługi błędów, które będą przydatne w takim przypadku. Innym podejściem, które może pomóc, jest modułowość. Na przykład dzielę mój plik inicjujący na kilka różnych plików (używając
provide
odpowiednio) i ładuję je za pomocą tej funkcji zamiastrequire
:Błąd podczas ładowania pliku w ten sposób nadal spowoduje wydrukowanie komunikatu, ale nie uniemożliwi wykonywania niczego poza plikiem, w którym błąd rzeczywiście wystąpił.
Oczywiście ta funkcja nie różni się tak naprawdę od zawijania
require
rozmowywith-demoted-errors
(napisałem ją, zanim się dowiedziałemwith-demoted-errors
), ale ważne jest to, że można zasadniczo zaimplementować coś takiego jak kombinacja Danawith-demoted-errors
iunwind-protect
bez zawijania (potencjalnie bardzo długa) bloki kodu.źródło
eval-buffer
. Dzięki za opublikowanie.