Pracowałem nad rozwidleniem modułu CPAN, który jest teraz nieobsługiwany (o ile mogłem powiedzieć). W tym module używają one [email protected]
do przekazywania komunikatów o błędach do stosu. Innymi słowy, ustawiają one [email protected]
, jeśli coś pójdzie nie tak w każdym wywołaniu podprogramów i sprawdzają po wywołaniu, czy jest ustawione. Nigdy wcześniej nie widziałem tej zmiennej, ale pomyślałem, że to było przydatne, więc zacząłem używać go w ten sam sposób w kodzie. Ostatnio przeczytałem nieco więcej na ten temat i odkryłem, że jego cel jest nieco zawężony. Czytanie perlvar (i innych pytań na SO w tej sprawie) nie w pełni odpowiada na to pytanie, ale czy można w ten sposób używać [email protected]
? Niektóre zmienne "interpunkcyjne", które znam, zdecydowanie powinny być używane w takim ogólnym celu (niektóre nawet z local
), czy jest to jeden z tych przypadków, czy też kontynuuję tę praktykę?
Odpowiedz
[email protected]
jest względnie "niespecyficzna" zmienna specjalna w Perlu. Nic w Perlu nigdy nie czyta się z [email protected]
, a na końcu jest napisane tylko na bloku eval {}
. Dzięki temu jest względnie bezpiecznie używać do własnych celów sygnalizacji błędów.
W szczególności rdzeń IO::Socket
drzewo modułów to wykorzystać, aby wskazać niepowodzenie od konstruktora:
use IO::Socket::IP;
my $sock = IO::Socket::IP->new(...) or die "Cannot connect - [email protected]";
bardziej tradycyjnych $!
nie nadaje się tutaj, ponieważ $!
ma magii, która otacza libc poziomie errno
konstrukt; co oznacza, że można ustawić tylko na całkowitą wartość errno
, mimo że można ją odczytać jako liczbę lub ciąg znaków. Ponieważ czasami zdarzają się awarie, które nie odnoszą się bezpośrednio do wartości errno
(w przypadku IO::Socket
, na przykład wiele rodzajów awarii przelicznika), czasami $!
jest niewłaściwe.
[email protected]
zwykle nie jest jawnie ustawiony. Zamiast tego jest on ustawiany automatycznie, gdy wyjątek zostanie zgłoszony. Od perldoc die
:
LISTA die
die
podnosi wyjątek. Wewnątrz plikueval
wyświetlany jest komunikat o błędzie:[email protected]
, aeval
kończy się niezdefiniowaną wartością. Jeśli wyjątek znajduje się poza wszystkimi załączonymieval
s, niezajęty wyjątek wypisuje LISTĘ naSTDERR
i kończy z niezerową wartością. Jeśli chcesz zakończyć proces przy użyciu określonego kodu zakończenia, zobaczexit
.
Na przykład
#!/usr/bin/perl
eval {
print "Hi\n";
die "Something went wrong here";
print "Bye\n";
};
print [email protected];
drukuje
Hi
Something went wrong here at ./cr22854919 line 5.
Dopuszczalne jest użycie [email protected]
przekazać komunikaty o błędach w górę stosu w ten sposób, jako swego rodzaju try- mechanizm catch. Jednak ponieważ jest to zmienna globalna, należy ją przetworzyć jak najszybciej po bloku eval { }
, aby upewnić się, że żaden inny kod nie koliduje z obsługą wyjątku.
Druga magiczna zmienna powszechnie wykorzystywane do obsługi błędów jest $!
, który działa jak errno
w C.
Przykład:
my $path = "/tmp/no-such-file";
open F, '<', $path
or print STDERR "$path: $!\n";
wyjściowa:
/tmp/no-such-file: No such file or directory
- 1. Wizualizacja komunikatów o błędach gcc
- 2. MATLAB: odniesienie do komunikatów o błędach
- 3. Przekazywanie komunikatów o błędach w PHP
- 4. Wiele komunikatów o błędach językowych w javascript
- 5. Zmiana języka komunikatów o błędach w ASP.NET
- 6. Korzystanie z niestandardowych komunikatów o błędach authlogic
- 7. Jak włączyć tłumaczenie komunikatów o błędach sprawdzania poprawności komunikatów Symfony2?
- 8. renderowanie komunikatów o błędach z szynami JS
- 9. Jak edytować Odtworzenie komunikatów o błędach?
- 10. Zmiana języka komunikatów o błędach MySQL
- 11. Sprawdzanie poprawności wielu niestandardowych komunikatów o błędach
- 12. Jaki jest preferowany sposób dołączania komunikatów o błędach do C++?
- 13. Używanie wyliczenia do reprezentowania komunikatów o błędach w sposób legalny - czy jest to dobra praktyka?
- 14. Uzyskiwanie dostępu do komunikatów o błędach dla zagnieżdżonego pola atrybutu
- 15. Obsługa znanych błędów i komunikatów o błędach w metodzie
- 16. Najlepszy sposób zwracania komunikatów o błędach w usługach REST?
- 17. Haskell: zrozumienie "No instancji dla" komunikatów o błędach w ghci
- 18. Zmiana języka komunikatów o błędach w SQL Server Management Studio
- 19. Po wyświetleniu podejrzanych komunikatów o błędach w pliku dziennika
- 20. Jak można pominąć okna dialogowe komunikatów o błędach DataSnap Delphi?
- 21. Nie chcę wyświetlać komunikatów o błędach z ParsleyJS
- 22. Powracanie komunikatów o błędach API za pomocą Pythona i kolby
- 23. Szyny 3: Powielanie komunikatów o błędach sprawdzania poprawności podczas testowania
- 24. Łapanie komunikatów o błędach libc, przekierowanie z/dev/tty
- 25. Importowanie GDAL drukuje wiele komunikatów o błędach, ale nadal działa
- 26. Komunikaty o błędach GNU C++
- 27. Komunikaty o błędach Firebase w różnych językach?
- 28. Magistrala usług Azure i sesje przesyłania komunikatów
- 29. Używanie Tomcat do przesyłania strumieniowego
- 30. Jak zastąpić standardowe komunikaty o błędach DataAnnotations