2014-12-20 13 views
5

Nie rozumiem dobrze, jak Railsy zawierają (lub nie?) Jakiś plik z katalogu aplikacji.Jak uwzględnić niestandardowy wyjątek w Railsach?

Na przykład utworzyłem nową aplikację katalogu/wyjątki do tworzenia własnych wyjątków. Teraz, z pliku pomocy, chcę podnieść jeden z moich wyjątków.

Czy mam dołączyć coś do tego pomocnika?

pomocnika: pomocnicy/communications_helper.rb

//should I include something or it's suppose to be autoloaded? 
module CommunicationsHelper 
begin. 
. 
. 
. 
    raise ParamsException, "My exception is lauch!" 
rescue StandardError => e 
... 
end 
end 

Wyjątek: wyjątki/params_exception.rb

class ParamsException < StandardError 
    def initialize(object, operation) 
    puts "Dans paramsException" 
    end 

end 

Nic konkretnego z moim podbiciu na wyjściu ...

Dzięki!

EDIT: Dzięki wszystkim, twoje dwie odpowiedzi były pomocne w inny sposób. Nie podniosłem dobrze wyjątku, tak jak powiedziałeś, ale również zapomniałem zaktualizować plik config.rb. więc teraz I „ve:

rescue StandardError => e 
    raise ParamsError.new("truc", "truc") 

Inne pytanie, czy wiesz, gdzie mogę złapać podwyżkę? Bo jestem już w bloku, więc jestem trochę zagubiony ...

+0

Proponuję utworzyć osobny kontroler i wyznaczyć dla niego błędy. Wyglądałoby to prosto. – Nithin

Odpowiedz

3

Po pierwsze, myślę, że niepoprawnie podnosisz swój wyjątek.

W niestandardowej klasie wyjątków metoda initialize przyjmuje argumenty. Dlatego należy podnieść go z:

raise CustomError.new(arg1, arg2, etc.) 

Read this.

Na koniec, nie ratuj z StandardError, jeśli CustomError jest dzieckiem StandardError; w przeciwnym razie uratowane zostanie twoje ręczne "podniesienie".

4

Jeśli nie widzisz wyjścia z Twojego raise, upewnij się, że nie uratowałeś błędu przez przypadek, ponieważ twój błąd jest podklasą StandardError:

begin 
    raise ParamsException, "My exception is lauch!" 
rescue StandardError => e # This also rescues ParamsException 
end 

na marginesie, w Ruby jest to powszechna praktyka, aby mieć swoje błędy niestandardowe kończą Error zamiast Exception. W przeciwieństwie do niektórych innych języków programowania, klasy kończące się Exception są przeznaczone dla błędów na poziomie systemu.

+1

Railsy powinny automatycznie ładować wszystko z podkatalogów 'app' –

+0

Słyszałem o tym również, więc uważasz, że nie muszę dodawać linii config.autoload_paths + =% W (# {config.root}/app/exceptions) ? –

+1

@JulienLeray Sprawdziłem również to, aby zweryfikować. Rzeczywiście nie musisz dodawać podkatalogów 'app' do ścieżki autoload. Jeśli ładowanie się nie powiedzie, na pewno zobaczyłbyś 'LoadError', ponieważ ten nie został uratowany w twoim kodzie. – fivedigit