Najlepszy samouczek wyjątkiem Ruby W 2024 r. W tym samouczku możesz dowiedzieć się Oświadczenie Zastosowanieponawiania,Oświadczenie Zastosowaniepodbicie,Zapewniająstosowanie sprawozdania,Korzystanieelse,Złapać i rzucić,Klasa Exception,
Wyjątki i wykonanie są zawsze połączone. Po otwarciu pliku, który nie istnieje, a nie jest prawidłowo poradzić sobie z sytuacją, a następnie program jest uważany za niskiej jakości.
Jeśli wystąpi wyjątek, program zatrzymuje się. Obsługa wyjątków dla wszystkich rodzajów błędów, które mogą wystąpić w trakcie realizacji programu, tak aby podjąć odpowiednie działania, a nie pozwolę program całkowicie zatrzymany.
Ruby zapewnia doskonały mechanizm obsługi wyjątków. Możemy dołączyć kod, który może rzucić wyjątek i użyć klauzulratowniczychpowiedzieć Ruby idealny rodzaj wyjątku mają być przetwarzane wrozpocznij / zakończbloku.
begin #开始 raisepl #抛出异常 rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException $! #表示异常信息 $@ #表示异常出现的代码位置 else #其余异常 pl ensure #不管有没有异常,进入该代码块 end #结束
Abyrozpocząćwszystko odratowniczajest chronione. Jeżeli podczas wystąpi wykonanie wyjątkiem bloku kodu, kontrola zostanie przekazana międzykońcemiratunek bloku.
Dla każdego blokuBEGINklauzuliratunkowego,Ruby i wyjątek rzucony z kolei do każdego porównania parametrów. Jeśli typ klauzuli ratowniczej Wyjątkiem nazewnictwa i wyjątek wyrzucony przez tego samego prądu, czy klasa dominująca wyjątkiem, mecz był udany.
Jeśli wyjątek nie pasuje do żadnego określonego rodzaju błędu, możemy użyć klauzulielseprzecież klauzuliratowniczej.
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" end rescue file = STDIN end print file, "==", STDIN, "\n"
Przykłady powyższego przykładu jest uruchomiony. Jakwidać,STDIN zastąpićplik,ponieważotwartanie powiodła się.
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
Można użyć blokratunkowyzłapać wyjątek, a następnie za pomocą bloku oświadczenieponawianiazaczynajązacząćod początku.
begin # 这段代码抛出的异常将被下面的 rescue 子句捕获 rescue # 这个块将捕获所有类型的异常 retry # 这将把控制移到 begin 的开头 end
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" end rescue fname = "existant_file" retry end
Poniżej znajduje się proces przepływu:
Uwaga: Jeśli przemianowany plik nie istnieje, ten kod siły nieograniczone próby.Więc obsługa wyjątków, należy zachować ostrożnośćpowtórzenie.
Można użyć instrukcjiraiserzuca wyjątek. Poniższa metoda zgłasza wyjątek, gdy zadzwoni. Jego drugi komunikat będzie odtwarzany.
raise 或 raise "Error Message" 或 raise ExceptionType, "Error Message" 或 raise ExceptionType, "Error Message" condition
Pierwsza forma po prostu ponownie rzucić bieżący wyjątek (jeśli nie ma prądu jest wyjątek z RuntimeError). Służy do wyjaśnienia przed przychodzącym wyjątków Wyjątek obsługi wyjątków.
Druga forma tworzy nowy wyjątekRuntimeError,wyznaczając jej wiadomość na podany ciąg znaków. Po wywołaniu stosu rzucić wyjątek.
Trzecią formą pierwszego parametru, aby utworzyć wyjątek, a następnie ustaw powiązanych wiadomości jako drugi parametr.
Czwarta forma i trzecia forma jest podobna, można dodać żadnych dodatkowych instrukcji warunkowych (npchyba)rzucić wyjątek.
#!/usr/bin/ruby begin puts 'I am before the raise.' raise 'An error has occurred.' puts 'I am after the raise.' rescue puts 'I am rescued.' end puts 'I am after the begin block.'
Uruchom wyjście Powyższy przykład to:
I am before the raise. I am rescued. I am after the begin block.
Kolejne przykłady użycia demonstracjapodbicie:
#!/usr/bin/ruby begin raise 'A test exception.' rescue Exception => e puts e.message puts e.backtrace.inspect end
Uruchom wyjście Powyższy przykład to:
A test exception. ["main.rb:4"]
Zdarza się, że niezależnie od tego, czy jest wyjątek, trzeba upewnić się, że jakiś proces jest zakończony na końcu bloku kodu. Na przykład, można otworzyć plik w momencie wejścia, po wyjściu z bloku, trzeba się upewnić, aby zamknąć plik.
zapewnienieklauzuli zrobić to. zapewniają umieszczone po ostatniej klauzuli ratowniczej i zawiera kod zakończenia bloku Blok jest zawsze wykonywany. To jest normalne, aby wyjść z bloku, rzucać i obsługi wyjątków, czy czy to z powodu przechwycony wyjątek kończy, żadna z tychstosunków,zapewnią blok będzie zawsze uruchamiane.
begin #pl 过程 #pl 抛出异常 rescue #pl 处理错误 ensure #pl 最后确保执行 #pl 这总是会执行 end
begin raise 'A test exception.' rescue Exception => e puts e.message puts e.backtrace.inspect ensure puts "Ensuring execution" end
Uruchom wyjście Powyższy przykład to:
A test exception. ["main.rb:4"] Ensuring execution
Jeśli klauzulaelsejest, to jest zwykle umieszczony po klauzuliratowniczej,zanim którykolwiekzapewnić.
Ciałoinnegoklauzula jest wykonywana tylko wtedy, gdy organizm kodu bez rzuca wyjątek.
begin #pl 过程 #pl 抛出异常 rescue #pl 处理错误 else #pl 如果没有异常则执行 ensure #pl 最后确保执行 #pl 这总是会执行 end
begin # 抛出 'A test exception.' puts "I'm not raising exception" rescue Exception => e puts e.message puts e.backtrace.inspect else puts "Congratulations-- no errors!" ensure puts "Ensuring execution" end
Uruchom wyjście Powyższy przykład to:
I'm not raising exception Congratulations-- no errors! Ensuring execution
Zmienna Zastosowanie $! Może złapać rzucony komunikat o błędzie.
Mechanizm podnoszenia i Wyjątkiem ratownicza może zrezygnować z realizacji w przypadku wystąpienia błędu, czasem trzeba skakać w normalnym procesie jakiejś głęboko zagnieżdżonych struktury. W tym momencie połowu i rzucać się przydać.
catchdefiniuje imię (może być symbolem lub String) Etykieta bloku. Blok jest wykonywany normalnie wiem napotka rzut.
throw :lablename #pl 这不会被执行 catch :lablename do #pl 在遇到一个 throw 后匹配将被执行的 catch end 或 throw :lablename condition #pl 这不会被执行 catch :lablename do #pl 在遇到一个 throw 后匹配将被执行的 catch end
Poniższy przykład, jeśli użytkownik wpisze '!' Reaguje na żadne polecenia, użyj rzut wypowiedzieć interakcji z użytkownikiem.
def promptAndGet(prompt) print prompt res = readline.chomp throw :quitRequested if res == "!" return res end catch :quitRequested do name = promptAndGet("Name: ") age = promptAndGet("Age: ") sex = promptAndGet("Sex: ") # pl # 处理信息 end promptAndGet("Name:")
Powyższy program wymaga interakcji człowieka, można spróbować na komputerze. Uruchom wyjście Powyższy przykład to:
Name: Ruby on Rails Age: 3 Sex: ! Name:Just Ruby
Standardowe zajęcia i moduły Ruby rzucona. Wyjątek stanowią wszystkich klas hierarchii, w tym górnej części wewnętrznej klasy wyjątku. Kolejna warstwa jest siedem różnych typów:
Krytyczny jest warstwą innego wyjątku, lecz interpreter Ruby używać go tylko wewnętrznie.
ScriptError i StandardError mają kilka podkategorii, ale tutaj musimy znać te szczegóły. Najważniejszą rzeczą jest to, aby stworzyć własną klasę wyjątku, muszą być podklasą klasy Exception lub jego potomstwo.
Spójrzmy na przykład:
class FileSaveError < StandardError attr_reader :reason def initialize(reason) @reason = reason end end
Spójrzmy teraz na poniższym przykładzie być stosowane w wyżej wyjątkami:
File.open(path, "w") do |file| begin # 写出数据 pl. rescue # 发生错误 raise FileSaveError.new($!) end end
Tutaj najważniejsza linia jestpodniesienieFileSaveError.new ($!). Nazywamy podniesienia schematycznie wyjątek wystąpił, to uchwalił nową instancję FileSaveError powodu specyficznych zaburzeń wywołanych przez dane zapisu nie powiedzie się.