2010-08-01 4 views
32

Вы можете создать подкласс исключения, чтобы сделать его более наглядным, но как вы должны установить сообщение по умолчанию?Исключительные классы ошибок Ruby's

class MyError < StandardError 
    # default message = "You've triggered a MyError" 
end 

begin 
    raise MyError, "A custom message" 
rescue Exception => e 
    p e.message 
end 

begin 
    raise MyError 
raise Exception => e 
    p e.message 
end 

Первый должен вывести «пользовательское сообщение»

Второй должен вывести «Вы вызвали MyError»

Любые предложения по наилучшей практике?

ответ

57

Определите метод initialize, который принимает сообщение как аргумент со значением по умолчанию. Затем вызовите метод инициализации StandardError с этим сообщением (используя super).

class MyError < StandardError 
    def initialize(msg = "You've triggered a MyError") 
    super(msg) 
    end 
end 
+29

Просто 'супер' достаточно. Если вы вызываете 'super' без списка аргументов, он просто передает все аргументы, поэтому, когда вы действительно хотите передать аргументы * no *, вы должны явно называть' super() '. –

+0

@ JörgWMittag Почему все пользовательские классы ошибок наследуются от 'StandardError'? Любая причина этого? –

+0

@ArupRakshit Потому что он безопасен. Всякий раз, когда вы спасаете от ошибок, он должен быть «StandardError» (или ниже), поскольку ошибки более высокого уровня, такие как «Исключение», могут быть даже сброшены при нажатии CTL-C и т. Д. См. Это для получения дополнительной информации http://rails-bestpractices.com/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror – Sean

1

Вы также можете перезаписать метод message в подклассе и возвращает строку, которую вы хотели бы отображаться. Я предпочитаю это, потому что кажется, что он немного чище, если вы хотите сделать что-нибудь интересное, прежде чем отображать сообщение.

class CustomError < StandardError 

    def initialize(error_code, error_info) 
    @code, @info = error_code, error_info 
    end 

    def message 
    "<Code: #{@code}> <Info: #{@info}>" 
    end 

end 
Смежные вопросы