2011-08-25 18 views
29

Zastanawiam się ... Czytałem o Go już jakiś czas temu i próbowałem coś w nim zaprogramować. Wydaje mi się całkiem interesujący. Ale dotarłem do handling "exceptions" in this language. Czytałem o ich podejściu i wydaje się to rozsądne. Chciałbym wiedzieć, jakie są zalety standardowego, wyjątkowego podejścia do stylu Go? Jakie są plusy i minusy?Obsługa wyjątków w języku Google Go

Edytuj Mówiąc prosto: nie chcę robić żadnej świętej wojny na temat wyjątków. Zastanawiam się tylko, czy ten styl błędów obsługi ma jakieś zalety? Jakie są rzeczywiste zalety tego stylu w porównaniu ze standardowymi wyjątkami? Czy w ogóle warto się zastanawiać?

Odpowiedz

50

panika/odzyskać jest moralnym odpowiednikiem wyjątków try/catch. Istnieje powierzchowna różnica (składnia) i subtelna, ale ważna różnica w zamierzonym użyciu.

Najlepsze wyjaśnienie problemów z wyjątkami w ogóle to "Cleaner, more elegant, wrong" i jest to dobry przegląd zalet/wad wyjątków w porównaniu do zwracanych kodów błędów.

Go projektanci zdecydowali, że obsługa błędów poprzez zwrócenie kodów błędów z funkcji to idiomatyczny sposób postępowania, a język obsługuje wiele wartości zwracanych, aby uczynić go syntaktycznie łatwym. Chociaż zapewniany jest tryb panika/odzyskiwanie, różnica nie dotyczy funkcjonalności, ale zamierzonego zastosowania.

Inne języki ujawniające wyjątki promują ich stosowanie, aw praktyce są często używane (czasem nawet niewłaściwie używane).

Go zniechęca do użycia paniki/odzyskania. Możesz to zrobić, ale powinieneś to robić tylko w bardzo ograniczonych scenariuszach.

Jeśli spojrzysz na własną bibliotekę Go, większość uses of panic służy do sygnalizowania krytycznych błędów, wskazujących na błąd wewnętrzny (np. Błąd) w kodzie biblioteki lub wywołanie biblioteki z niewłaściwymi danymi (np. Przekazywanie danych nie json do json) funkcje dekodowania).

Ale jak artykuł, do którego się połączyłeś, wskazuje: "Konwencja w bibliotekach Go jest taka, że ​​nawet jeśli pakiet wykorzystuje wewnętrznie panikę, jej zewnętrzny interfejs API nadal przedstawia jawne wartości zwracanych błędów."

To różni się od języków takich jak C#, Java, Python lub C++, gdzie wiele standardowych kodów bibliotecznych może generować wyjątki w celu sygnalizowania błędów. Te języki wymagają wyjątków. Go zniechęca do użycia paniki/odzyskania.

Podsumowując:

  • idiomatyczne styl Go jest wykorzystanie kodów błędów, aby poinformować rozmówcę o błędach
  • użycie panika/odzyskać tylko w rzadkich przypadkach:
    • do „katastrofy” swój program gdy napotykamy wewnętrzną niespójność wskazującą na błędy w kodzie. Jest to w zasadzie pomoc debugowania.
    • jeśli radykalnie upraszcza obsługę błędów w kodzie (ale jeśli kod ma być używany przez innych, nigdy wystawiać takie spanikowaniu do rozmówców)

W praktyce ważne jest, aby używać języka na idiomatyczne styl. W Go to zwracanie kodów błędów i unikanie paniki/odzyskanie. W języku C#, który używa wyjątków do sygnalizowania niektórych błędów.

+0

Dziękuję, to jest odpowiedź, której się spodziewałem. – Archie

+0

Autorzy Go nie zniechęcają do używania paniki (przynajmniej już jej nie ma). Na przykład, Go wiki wyraźnie popiera użycie panice na poziomie pakietu dla połączeń zagnieżdżonych. https://code.google.com/p/go-wiki/wiki/PanicAndRecover#Usage_in_a_Package –