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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3292閲覧

python:クラス内のエラー発生時に特定の処理をさせる

BTB

総合スコア136

例外処理

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/22 09:41

実現したいこと

class内のmethodでエラーが発生したときに、class内の指定したmethodを必ず実行するようにする簡潔な方法はありますでしょうか。

詳細

基本的にはtry文がよくあるやり方だと思うのですが、私が思いついた書き方(下記コードを参照)では、非常に冗長なコードになってしまいます。

一般的な書き方

python

1################# 書き方1 ############# 2## 問題点 3## メソッドを使うたびにtry文が必要 4class Hoge_v1: 5 def 問題があるメソッド(self): 6 print("問題があるメソッドが実行される") 7 ここでエラー発生 8 9 def エラーが起きたときに実行させたいメソッド(self): 10 print("エラー発生時の処理") 11 12 13例1 = Hoge_v1() 14 15try: 16 例1.問題があるメソッド() 17except: 18 例1.エラーが起きたときに実行させたいメソッド() 19 20"""出力例 21問題があるメソッドが実行される 22エラー発生時の処理 23""" 24 25 26################# 書き方2 ############# 27## 問題点 28## クラス内のメソッドが複数ある場合に、全てにtry文が必要 29class Hoge_v2: 30 def 問題があるメソッド(self): 31 try: 32 print("問題があるメソッドが実行される") 33 ここでエラー発生 34 except: 35 self.エラーが起きたときに実行させたいメソッド(self) 36 37 def 問題があるメソッド2(self): 38 try: 39 print("問題があるメソッドが実行される") 40 ここでエラー発生 41 except: 42 self.エラーが起きたときに実行させたいメソッド(self) 43 44 def エラーが起きたときに実行させたいメソッド(self): 45 print("エラー発生時の処理") 46 47 48例2 = Hoge_v2() 49 50try: 51 例2.問題があるメソッド() 52except: 53 例2.エラーが起きたときに実行させたいメソッド() 54 55"""出力例 56問題があるメソッドが実行される 57エラー発生時の処理 58""" 59

その他

クロージャーやデコレーターを用いたらうまく書けそうな気もするのですが思いつきませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

デコレータを使う例です。

class MyClass: def my_exception(func): def wrapper(self, *args, **kwargs): try: func(self, *args, **kwargs) except Exception as e: ''' 共通の例外処理をここに書く ''' print(f"{self.value}にて例外発生") print(e) print() finally: pass return wrapper @my_exception def bar(self, addition=''): self.value = "bar" + addition a="#" a+0 return @my_exception def baz(self): self.value = "baz" 1/0 return my_exception = staticmethod( my_exception ) # 実行例 m = MyClass() m.bar() m.bar("-abc") m.bar(addition="123") m.baz()

投稿2020/12/22 10:25

編集2020/12/22 10:27
sfdust

総合スコア1137

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

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

BTB

2020/12/22 15:13

@sfdustさん やはりデコレーダーでできたのですね。 求めていたことができました。 助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問