質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1839閲覧

例外処理を共通化したい

nanase21

総合スコア144

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/03 02:12

編集2020/09/03 02:18

実現したいこと

以下の例外処理のrescueを何かの方法でまとめて、一行で呼び出す方法を知りたい。
service層に例外処理を置いて試してみたのですが私では出来ませんでした...
何回も、複数行に渡って同じ例外処理を書くのは生産性にかけると思うのでもし共通化する方法があればご教示いただきたいです。

ruby

1 def create 2 ActiveRecord::Base.transaction do 3 Payjp::Customer.retrieve('cus_xxxx') 4 end 5 rescue Payjp::CardError => e 6 error_message(e, 1) 7 rescue Stripe::RateLimitError => e 8 error_message(e, 2) 9 rescue Payjp::InvalidRequestError => e 10 error_message(e, 3) 11 rescue Payjp::AuthenticationError => e 12 error_message(e, 4) 13 rescue Payjp::APIConnectionError => e 14 error_message(e, 5) 15 rescue Payjp::StripeError => e 16 error_message(e, 6) 17 rescue => e 18 error_message(e, 7) 19 end 20 21 private 22 23 def error_message(e, type) 24 case type 25 when 1 then puts "subject: card is incorrect" 26 when 2 then puts "subject: Too many requests made to the API too quickly" 27 end 28 # puts e.error # NOTE only development 29 Rails.logger.debug(e) 30 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/03 02:15

error_messageはどのようなメソッドですか? (番号をrescue側で付与せずに、error_messageの側に任せてしまうことはできないのでしょうか?)
nanase21

2020/09/03 02:19

エラー内容をログに吐き出す処理が書かれています。
guest

回答1

0

ベストアンサー

error_messageの側に振り分け処理を移設する、という形ではどうでしょうか?

ruby

1 def create 2 ActiveRecord::Base.transaction do 3 Payjp::Customer.retrieve('cus_xxxx') 4 end 5 rescue => e 6 error_message(e) 7 end 8 9 ERROR_MESSAGES = { 10 Payjp::CardError => "subject: card is incorrect", 11 Stripe::RateLimitError => "subject: Too many requests made to the API too quickly" 12 }.freeze 13 14 def error_message(e) 15 message = ERROR_MESSAGES[e.class] 16 puts message if message 17 # puts e.error # NOTE only development 18 Rails.logger.debug(e) 19 end 20

投稿2020/09/03 02:28

編集2020/09/03 02:34
maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanase21

2020/09/03 02:50

ご教示頂きありがとうございます。 rescue => e error_message(e, 7) どの例外か分からなかったっ場合に、以下のような形にしました。 例外のclass(今回で言うPayJP)がなかった場合も考えれるのでその場合は、error_messageメソッド内にunkownというメッセージを作成し、三項演算子でclassがあるかどうかをチェックするようにしたのですが、このような形でも大丈夫でしょうか? もしもっと良い方法がありましたら、二度手間をおかけして大変恐縮ですがご教示いただけると幸いです。 message = ERROR_MESSAGES[e.class] unkown = "subject: Something else happened, completely unrelated to PayJP" message.present? ? puts(message) : puts(unkown)
maisumakun

2020/09/03 02:53

それでもいいですが、もっとシンプルに「puts(message || ""subject: Something else happened, completely unrelated to PayJP")」のような形にもできます。
nanase21

2020/09/03 02:57

ありがとうございます。 ご教示頂いた方がシンプルですね。 教えていただいた方法にしたい思います。 ご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問