x = StandardError.new(:hello)
y = StandardError.new(:hello)
x == y # => true
x === y # => true
begin
raise x
rescue x
puts "ok" # gets printed
end
begin
raise x
rescue y
puts "ok" # doesn't get printed
end
Dlaczego nie drukuje się drugie "ok"? Nie mogę tego rozgryźć. Przeczytałem here, że ruby używa operatora ===
, aby dopasować wyjątki do klauzul ratunkowych, ale nie jest to prawdą.Co jest nie tak z tym przykładem ratunkowym?
Używam Ruby 1.9.3
EDIT: A więc wydaje się, że po zrobieniu raise x
, x == y
i x === y
nie trzymać. Wydaje się, ponieważ x
i y
no longer have the same backtrace.
Nie oznacza to, że „łapać StandardError i podklasy i umieścić między innymi w zmienna y”. 'y' nie jest interpretowane jako wartość (tak jak chcę), ale jako nazwa zmiennej. – Norswap
Myślę, że jeśli próbujesz dopasować wzorce do tagów RFID, idiom "podnieś/złap" może nie być najłatwiejszym sposobem. Co powiesz na "case" lub dynamiczną wysyłkę za pomocą wzorców? –
Aplikacja ma pewną logikę "niskiego poziomu", która komunikuje się z kartą. Tutaj są zgłaszane wyjątki. Powyżej tego jest wyższy poziom, logika aplikacyjna. Niektóre błędy zwracane przez znacznik są w rzeczywistości dość wysokim poziomem (takie rzeczy jak "plik już istnieje w tagu") i muszą wyświetlać kopie zapasowe z powrotem do użytkownika. Wyjątki wydają się najlepszą opcją. – Norswap