Latest web development tutorials

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ę.