私は、ソースのタイプからデータを取得する関数を呼び出していますので、FileReader
というスーパークラスを作成し、それぞれFTP、SFTP、Googleドライブなどのクラスを作成しました。継承し、get_data
関数を実装します。メソッド/クラス間で同じ例外をキャッチ
宝石から返された例外をキャッチして、外部要因をバグレポートとしてRollbarに報告しないようにしたいので、例外を救済して、ファイルが見つからないときに適切なメッセージをユーザーに返しますタイムアウトなどです。Rescueブロックはスーパークラスにあります。なぜなら、SocketError、EOFErrorなどの例外はすべてのサブクラスで共通するため、コードを乾燥させようとしているからです。
class FileReader
def get_data
nil
end
def read
data = nil
begin
data = get_data
rescue EOFError => e
# return error message
rescue SocketError => e
# return error message
rescue OpenURI::HTTPError => e
# return error message
rescue Net::FTPPermError => e
# return error message
rescue Net::SFTP::StatusException => e
# return error message
rescue Errno::ETIMEDOUT => e
# return error message
rescue Exception => e
puts e.message
puts e.backtrace.join("\n")
Rollbar.error(e, :source => self)
# return error message
end
return data
end
end
FtpFileReaderはget_data
機能を実装するためにFileReaderのクラスを継承しています。
と私のread
メソッドは、私のRailsモデルから呼び出されます。
しかし、そのような例外をキャッチすることは私にとって難しいことです。 呼び出すメソッドread
がこの例外をキャッチしていますが、FileReader#get_data
メソッドは同じ例外もキャッチしますが、その中にレスキューブロックを実装していますか?
read
ではなく、FileReader get_data
メソッドでこれらの例外を捕捉する必要がありますか?または、サブクラス自体でこれらの特定の例外をキャッチし、サブクラスの各get_data
メソッドでエラーメッセージを返しますか?最終的にキャッチするクラスは大きくなりますが、EOFErrorを複製すると、SocketErrorはあまり乾燥しません。このような場合に例外を処理する最良の方法は何でしょうか?
そのエラーが(キャッチ以外のすべてのレスキュー例外条項)あなたのいずれかの句でキャッチする必要がありますだと思いますなぜ –
@FrederickCheungは、あなたは何を意味するのですか? – nayiaw
私は、エラーが「レスキュー例外」ビットに終わるべきではないと思うのはなぜですか? –