Sądzę, że inne odpowiedzi tutaj są poprawne dla twojego konkretnego problemu, ale ogólnie rzecz biorąc, można użyć panic
, aby skrócić obsługę błędów, będąc wciąż dobrze zachowującą się biblioteką. (, To znaczy nie panic
nia poza granice pakietu)
Rozważmy:
func mustMarshal(v interface{}) []byte {
bs, err := json.Marshal(v)
if err != nil {
panic(err)
}
return bs
}
func encodeAll() (err error) {
defer func() {
if r := recover(); r != nil {
var ok bool
if err, ok = r.(error); ok {
return
}
panic(r)
}
}()
ea := mustMarshal(a)
eb := mustMarshal(b)
ec := mustMarshal(c)
return nil
}
Kod ten wykorzystuje mustMarshal
do panic
gdy istnieje problem Organizowanie wartość. Ale funkcja encodeAll
z powodu paniki i zwróci ją jako normalną wartość błędu. Klient w tym przypadku nigdy nie jest narażony na panikę.
Ale to pojawia się z ostrzeżeniem: stosowanie tego podejścia wszędzie nie jest idiomatyczne. Może być również gorszy, ponieważ nie nadaje się dobrze do obsługi każdego pojedynczego błędu, ale mniej lub bardziej traktuje każdy błąd tak samo. Ale ma swoje zastosowania, gdy istnieje mnóstwo błędów do obsłużenia. Jako przykład, używam tego rodzaju podejścia w aplikacji internetowej, gdzie program obsługi najwyższego poziomu może przechwytywać różnego rodzaju błędy i wyświetlać je odpowiednio użytkownikowi (lub plikowi logicznemu) w zależności od rodzaju błędu.
Powoduje, że kod terser jest stosowany, gdy występuje wiele błędów, ale z powodu utraty idiomatycznego Go i obsługiwania każdego błędu specjalnie. Inną wadą jest to, że może ona uniemożliwić coś, co może spowodować panikę. (Ale można to rozwiązać w prosty sposób, używając własnego typu błędu.)
Tytuł dotyczy obsługi błędów, ale wydaje się, że zwraca je zamiast [panika()] (http://golang.org/doc) /effective_go.html#panic), czy istnieje powód, dla którego? A także za niezwłoczny powrót, gdy tylko 1 Marshall zawiodł? – Deleplace
Dlaczego miałbym używać opcji paniki() zamiast zwracania błędów? Z dokumentów, do których się przyłączyłeś: "Najczęstszym sposobem zgłoszenia błędu do osoby dzwoniącej jest zwrócenie błędu jako dodatkowej wartości zwracanej." Mam wrażenie, że jest to "zwykły" przypadek. Nie jest to błąd o takiej surowości, że użycie paniki() wydaje się uzasadnione. (Proszę mnie poprawić, jeśli nie rozumiem przypadków użycia funkcji paniki.) –
Wiem, że zostałeś przegłosowany za stwierdzenie, z czym zgadza się każdy Suseł, nie używanie/nadużywanie paniki, ale powyższy przykład kodu jest po prostu zły/niejasny. Marszałek wszystko, ale tylko pierwszy błąd, który widzimy później? Ale potem wyjaśniasz "obsługa wszystkich błędów za jednym razem", głównie unieważniając próbkę kodu. Znowu zależy to od tego, co robisz, i paniki/odzyskiwania mogą być odpowiednie. Osobiście natychmiast pomyłę w przypadku nieudanego marszałka i będę bardziej opisowy, że 'cJson' zawiódł, dołączając do' err'. Ale nawet to zależy od kontekstu, w którym jest to realizowane. – dskinner