python_ゼロ除算_zero_0で除算_part2


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` は

呼び出し元で捕捉されます。



コメント