k_ kodly
Wróć do kursu
Ruby od zera do własnej aplikacji

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.

  1. Numer linii. Coś w rodzaju b.rb:2 oznacza: plik b.rb, linia 2. To właśnie tam Ruby utknął.
  2. Opis. Krótkie zdanie w języku angielskim wyjaśniające, co poszło nie tak.
  3. 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 SyntaxError zatrzymuje 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.

  1. Zmień puts na puuts w drugiej linii.
  2. Popraw to, a następnie usuń zamykający cudzysłów po Tea.
  3. 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.

solution.rb
wynik
Tutaj pojawi się wynik działania Twojego programu.
Sprawdź się

Quiz

1.

Uruchamiasz program i widzisz następujący komunikat:

Welcome
app.rb:2:in '<main>': undefined method 'prnt' for main (NoMethodError)

Co wiesz o wierszu 1?

2.

Twój program nie generuje żadnego wyniku, tylko błąd o treści (SyntaxError). Co to oznacza?

3.

Napisałeś następujący kod:

puts "One"
puts "Two
puts "Three"

Ruby zgłasza błąd w wierszu 3. Gdzie znajduje się rzeczywisty błąd?