def divide01() :
ary_b = [ "2" , "3","a" , "0", "4"]
a = 10.3
ary_answer = []
len01 = len( ary_b )
for i in range( len01 ) :
try :
answer = a / ary_b[ i ]
except ValueError as e:
continue
except ZeroDivisionError as e:
raise e
def calc_task() :
try :
divide01()
except :
print( "呼び出し元でエラーを捕捉しました。" )
上記のpythonのコードに
記述上のミスはないでしょうか?
それと、calc_taskの関数を実行したときに
divide01 の関数の exceptブロックで補足したエラーが
ValueErrorの場合は continueを実行して
つぎのループをはじめから実行し、
ZeroDivisionErrorの場合は
呼び出し元へ raise する、
というような処理内容にしたいのですが・・・
上記のコードで適切でしょうか?
↓
コードにはいくつかの修正が必要です。
以下に詳細を説明します。
### 問題点
1. **`ValueError` の捕捉が適切でない:**
- 配列 `ary_b` の要素は文字列なので、
数値演算を行うには型変換が必要です。
このため、`ValueError` は
`a / ary_b[i]` のような箇所では発生せず、
型変換で `int` や `float` に変換する際に発生します。
2. **`ZeroDivisionError` の捕捉と再送出:**
- `raise e` は適切ですが、
呼び出し元にエラーを送出したい場合、
`except` ブロックで `print` などを実行してはいけません。
3. **`TypeError` の未捕捉:**
- 配列の中に文字列があるため、
型変換を忘れると `TypeError` が発生します。
4. **ループ内で `continue` を使うタイミング:**
- エラーを補足し、
次のループに進むための `continue` は問題ありませんが、
エラーの種類に応じて適切に処理する必要があります。
---
### 修正コード
以下は、意図した動作を実現する修正版です:
```python
def divide01():
ary_b = ["2", "3", "a", "0", "4"]
a = 10.3
ary_answer = []
len01 = len(ary_b)
for i in range(len01):
try:
# 配列の要素を float に変換
value = float(ary_b[i])
# 除算を実行
answer = a / value
ary_answer.append(answer) # 正常な結果をリストに追加
except ValueError as e:
# 型変換エラーを補足して次のループへ
print(f"ValueError:
配列の要素が数値に変換できません ({ary_b[i]})")
continue
except ZeroDivisionError as e:
# 呼び出し元にエラーを再送出
raise e
return ary_answer
def calc_task():
try:
results = divide01()
print("計算結果:", results)
except ZeroDivisionError:
print("呼び出し元でエラーを捕捉しました。
ZeroDivisionError が発生しました。")
```
---
### 修正点の説明
1. **型変換:**
- 配列 `ary_b` の要素を浮動小数点数
(`float`)に変換しました。
これにより、`ValueError` が適切に発生します。
2. **`ValueError` の処理:**
- `ValueError` 発生時にエラーを補足し、
`continue` を使って次のループに進むようにしました。
3. **`ZeroDivisionError` の処理:**
- 0 除算エラーが発生した場合は、
`raise` を使用して呼び出し元に再送出しました。
4. **結果リストの追加:**
- `ary_answer` リストに正常な結果を追加し、
呼び出し元で利用可能にしました。
---
### 実行結果の例
```python
calc_task()
```
出力:
```
ValueError:
配列の要素が数値に変換できません (a)
呼び出し元でエラーを捕捉しました。
ZeroDivisionError が発生しました。
```
`ary_b` の要素 `"a"` はスキップされ、
`"0"` による `ZeroDivisionError` は
呼び出し元で捕捉されます。
コメント
コメントを投稿