wyjątkiem Ruby
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.
gramatyka
begin #开始 raise.. #抛出异常 rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException $! #表示异常信息 $@ #表示异常出现的代码位置 else #其余异常 .. 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.
Przykłady
#!/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>
Oświadczenie Zastosowanieponawiania
Można użyć blokratunkowyzłapać wyjątek, a następnie za pomocą bloku oświadczenieponawianiazaczynajązacząćod początku.
gramatyka
begin # 这段代码抛出的异常将被下面的 rescue 子句捕获 rescue # 这个块将捕获所有类型的异常 retry # 这将把控制移到 begin 的开头 end
Przykłady
#!/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:
- Wystąpił wyjątek podczas otwierania.
- Przejdź do uratowania. fname zostać przeniesiony.
- Przejdź na początek zacząć od ponownego wprowadzenia.
- Plik zostanie pomyślnie otwarty.
- Kontynuować proces podstawowy.
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.
Oświadczenie Zastosowaniepodbicie
Można użyć instrukcjiraiserzuca wyjątek. Poniższa metoda zgłasza wyjątek, gdy zadzwoni. Jego drugi komunikat będzie odtwarzany.
gramatyka
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.
Przykłady
#!/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"]
Zapewniająstosowanie sprawozdania
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.
gramatyka
begin #.. 过程 #.. 抛出异常 rescue #.. 处理错误 ensure #.. 最后确保执行 #.. 这总是会执行 end
Przykłady
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
Korzystanieelse
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.
gramatyka
begin #.. 过程 #.. 抛出异常 rescue #.. 处理错误 else #.. 如果没有异常则执行 ensure #.. 最后确保执行 #.. 这总是会执行 end
Przykłady
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.
Złapać i rzucić
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.
gramatyka
throw :lablename #.. 这不会被执行 catch :lablename do #.. 在遇到一个 throw 后匹配将被执行的 catch end 或 throw :lablename condition #.. 这不会被执行 catch :lablename do #.. 在遇到一个 throw 后匹配将被执行的 catch end
Przykłady
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: ") # .. # 处理信息 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
Klasa Exception
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:
- Przerwanie
- NoMemoryError
- SignalException
- ScriptError
- StandardError
- SystemExit
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 # 写出数据 ... 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ę.