Twój pierwszy błąd i jak go zinterpretować
Klikasz „Uruchom” i zamiast swojego tekstu widzisz to:
(irb):4:in '<main>': undefined method 'pust' for main (NoMethodError)
pust "Line two"
^^^^
Did you mean? puts
Niezrozumiały tekst, słowa, których nigdy nie widziałeś, nazwa pliku z dwukropkiem i liczbą. Instynktownie chcesz spanikować, skasować wszystko i zacząć od nowa.
Nie rób tego. Ten komunikat to najbardziej przydatna informacja, jaką Ruby kiedykolwiek Ci przekaże. Dosłownie wskazuje na błędny znak, a w połowie przypadków podpowiada, co chciałeś napisać.
Po tej lekcji będziesz potrafił spojrzeć na komunikat o błędzie, znaleźć numer linii, przeczytać to jedno ważne zdanie i naprawić problem zamiast zgadywać.
Teoria
Komunikat o błędzie składa się z trzech części, które warto przeczytać, zawsze w tej samej kolejności.
- Numer linii. Coś w rodzaju
b.rb:2oznacza: plikb.rb, linia 2. To właśnie tam Ruby utknął. - Opis. Krótkie zdanie w języku angielskim wyjaśniające, co poszło nie tak.
- Typ błędu, podany wielkimi literami w nawiasach, np.
(NoMethodError)lub(SyntaxError).
Wszystko inne to tylko dodatki. Przeczytaj te trzy elementy w podanej kolejności.
Przykłady
Błąd w nazwie metody. Chciałeś wpisać puts, a palce wpisały pust.
puts "Wiersz pierwszy"
pust "Wiersz drugi"
puts "Wiersz trzeci"
Wynik:
Wiersz pierwszy
b.rb:2:in '<main>': undefined method 'pust' for main (NoMethodError)
pust "Wiersz drugi"
^^^^
Did you mean? puts
Przeczytaj to po kolei. undefined method 'pust' oznacza, że Ruby nie zna żadnej metody o tej nazwie. Ruby nawet zgaduje, co miałeś na myśli.
Teraz spójrz na pierwszy wiersz wyniku. Wiersz pierwszy faktycznie został wyświetlony.
Pamiętaj z lekcji 4: Ruby przetwarza kod od góry do dołu.
Bez problemu wykonał wiersz 1, natrafił na błędny wiersz 2 i zatrzymał się w tym miejscu. Wiersz 3 nigdy nie został wykonany.
Kolejny Przykład
Brakujący zamykający cudzysłów.
puts "Hello"
puts "Goodbye
Wynik:
c.rb:2: syntax error found (SyntaxError)
1 | puts "Hello"
> 2 | puts "Goodbye
| ^ unterminated string meets end of file
Te same trzy części. Komunikat "unterminated string meets end of file" oznacza, że cudzysłów został otwarty, ale nigdy nie został zamknięty. Typ błędu: SyntaxError oznacza problem z interpretowaniem twojego kodu przez Ruby.
Dlaczego?
Te dwa przykłady ilustrują dwa momenty, w których program może się zawiesić.
Błąd SyntaxError pojawia się, zanim cokolwiek zostanie wykonane. Ruby najpierw odczytuje cały plik, aby sprawdzić, czy jest on poprawny z punktu widzenia języka Ruby. Brak zamknięcia cudzysłowu oznacza, że nie jest to możliwe. W związku z tym program odmawia uruchomienia i nie zostanie wykonana ani jedna linia kodu.
Wszystkie pozostałe błędy, w tym NoMethodError, pojawiają się w trakcie wykonywania programu. Ruby zaczyna od linii 1, przechodzi w dół i zatrzymuje się na linii, której nie potrafi przetworzyć. Wszystko, co zostało wyświetlone przed tym punktem, pozostaje na ekranie.
Jest to naprawdę przydatne. Jeśli część wyników pojawiła się przed błędem, wiesz, że pierwsze linie są w porządku, a problem leży dalej w tekście. Jeśli nic się nie wyświetliło, jest to błąd SyntaxError i musisz poszukać cudzysłowu, nawiasu lub zbłąkanego znaku.
Jeszcze jedna rzecz. Gdy nagromadzi się kilka błędów, numer linii podawany przez Ruby to miejsce, w którym zauważył problem, a nie zawsze to, w którym go popełniłeś. Otwórz cudzysłów w linii 2, zapomnij go zamknąć, a Ruby może zgłaszać błąd w linii 3, ponieważ to właśnie tam ostatecznie się poddał. Dlatego najpierw sprawdź zgłoszoną linię, a dopiero potem tę powyżej.
Typowe błędy
Całkowite pominięcie komunikatu. Najczęstszą reakcją na czerwony tekst jest skupienie się wyłącznie na kodzie. Komunikat zawiera już numer linii.
Ignorowanie pytania „Czy chodziło Ci o?”. Ruby porównuje Twoją literówkę z nazwami, które zna, i sugeruje najbardziej pasującą. Kiedy pojawia się komunikat Did you mean? puts, prawie zawsze ma rację.
Ślepe poleganie na numerze linii. Podobnie jak powyżej, w przypadku niezamkniętych cudzysłowów prawdziwy błąd często znajduje się o jedną linię wyżej. Rozwiązanie: jeśli zgłoszona linia wygląda na poprawną, spójrz wyżej.
Podsumowanie
- Komunikat o błędzie zawiera numer linii, opis oraz typ błędu. Należy zapoznać się z nimi w tej kolejności.
- Błąd
SyntaxErrorzatrzymuje program przed jego uruchomieniem, więc nic nie jest wyświetlane. - Inne błędy, takie jak
NoMethodError, pojawiają się w trakcie działania programu, więc dane wyjściowe przed błędną linią są nadal wyświetlane. - "Did you mean?" to sugestia języka Ruby dotycząca Twojej literówki i zazwyczaj jest ona poprawna.
- Jeśli zgłoszona linia wygląda na poprawną, sprawdź linię powyżej niej.
Ćwiczenie
Zadanie programistyczne
Zacznij od działającego kodu:
puts "Coffee"
puts "Tea"
puts "Water"
Celowo wprowadź błędy, po jednym na raz. Po każdej zmianie uruchom kod i zobacz jak na dany błąd zareagował Ruby.
- Zmień
putsnapuutsw drugiej linii. - Popraw to, a następnie usuń zamykający cudzysłów po
Tea. - Popraw to, a następnie usuń tylko otwierający cudzysłów przed
Tea.
W każdym przypadku odpowiedz: czy przed pojawieniem się błędu wyświetliło się coś, czy też nic? Czy wynik ten jest zgodny z tym, czego oczekiwałeś po tej lekcji?
Opcjonalne wyzwanie: wywołaj błąd, w którym Ruby zgłosi błąd w linii 3, mimo że popełniłeś błąd w linii 2.
Tutaj pojawi się wynik działania Twojego programu.