• 締切済み

pythonZeroDivisionError例外

cametan_42の回答

回答No.4

> では、第一、第二という位置は意味をもっておらず、 いや、「意味がない」とは言ってない。 「/」と言う表現に対しては意味不明になる、って言ったんです。 前、インタプリタの仕組み、で「構文解析」の話をしたけど。 単純に、例えば 5 / 0 って入力すると内部的にはoperator.truediv(5, 0)と言う表現に変換される。まぁ、そう字面通りに捉えていい。 第一引数は5になる。第二引数は0になる。operator.truedivが第一引数を第二引数で割る関数な以上、第二引数が0だと計算が出来ない。 だからエラーになるわけです。 > 計算できないから0の例外処理が実行されたという認識で合っていますか? そう、try節内で計算がまずは実行されてエラーが出る。そのエラーをexception節でキャッチして、「例外処理」が実行されるわけです。 > Error: division by zero > という「文字の並び」が出た理由、ロジック、がわからないという質問です そりゃException節に「そう出せ」って書いたからでしょ。 多分フォーマット文字列に引っかかってんじゃないか・・・? 例えばだね。こういうコードを書けば、だ。 try: a = 5 b = 0 c = a / b except ZeroDivisionError: print("この結果はクソだ") 「この結果はクソだ」って表示されるよ? つまり、貴方が悩んでるのは、例外処理じゃなくってPythonのフォーマット文字列の書き方を知らない、ってそっちの方なんだ。 まず、 except なんかのエラー as なんとか と書くと、「なんとか」と言うテキトーな変数名にキャプチャしたエラーの情報の(一部である)文字列が束縛される(このケースだと"division by zero"って文字列だ)。 んで、フォーマット文字列f"..."の中に置かれた{}(プレースホルダー等と呼ばれる)の中身には任意のブツを突っ込めるんだよ。 そうすると、exceptが形成するスコープ内で、「なんとか」って変数はprintに与えたフォーマット文字列に埋め込みが可能だ、ってそれだけの話なんだ。 事実次のようにやって実験してみればいい。 try: a = 5 b = 0 c = op.truediv(a, b) except ZeroDivisionError as x: print(f"この結果({x})はクソだ") 印字結果は"この結果(division by zero)はクソだ"になったでしょ? 繰り返すけど、こっちは「フォーマット文字列の使い方」の問題で、例外処理はあんま関係ないですね。

ketae
質問者

お礼

お疲れ様です 繰り返しますが、わたしはプログラマーではないですし、なる気もありません リファレンスで納得できればOKというレベルです で、一番カンタンなのは https://docs.python.org/ja/3/library/exceptions.html exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。 をみつけることでした 回答の中では chie65535さんの >「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 これがすっと入りました ありがとうございます 言語に対するわたしのアプローチが伝わらないと思いますが、たとえば英語という外国語を初心者が学ぶ場合、話したり通訳者・翻訳者になるつもりはないが、文法書のどこにどのように書いてあるかを みつけたい、みたいな感じです笑

関連するQ&A

  • phpの例外処理がエラーをトラップしてくれない。

    以下のように例外処理を記述しした場合、 try{ //ここでエラー } catch (Exception $e){ $ErrorMsg="その他エラー:".$e->getMessage(); } tryの中で、0除算によるエラーが発生してもエラーをトラップして、例外 処理のcatchに飛びません。 どのように記述すればエラーをトラップできるのでしょか?

    • ベストアンサー
    • PHP
  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP
  • 1行での計算について

    1行で以下の計算を行うには、どの言語がいいのでしょうか? perlで以下を試しましたが、ゼロ除算の為エラーになります。 やりたい計算 答え  = 5 / 134657 * 100 $ perl -e 'print 5 / 134657 * 100' 上記ですと、0.00371313782424976と表示されますが、これに変数を代入するとエラーになります。 % vi test.sh #!/bin/sh a=5 b=134657 answer=`perl -e 'print $a / $b * 100'` echo "answer = $answer" $ sh test.sh Illegal division by zero at -e line 1. 以上宜しくお願いします。

  • あらゆる例外に対応できるエラーハンドラ

    接続できなかったら例外発生、値がなかったら例外発生というのではなく、あらゆる例外に対応できるエラーハンドラって、書けないものでしょうか? error_log関数を使えば、簡単にファイルに書き込めますが、文章を自分で考えなくてはなりません。 error_log("エラーが発生しました",3,"err.log"); そうではなく、ゼロで除算すれば、ブラウザに、Warning: Division by zero in ~というのが表示される ので、このようなエラーメッセージをログに書き込むなり、メールで送信したいところです。 エラーハンドラの典型的な書き方や、とりあえず、これだけ書いとけ! というものはありませんか?

    • ベストアンサー
    • PHP
  • ゼロ除算

    CSSすら理解してない私が見よう見まねでphpを使ってみたのですが、エラーが起こって困ってます。 Warning: Division by zero <?php $a = $_POST["a"]; $b = $_POST["b"]; $c = $a + $b; $d = $a / $c; $e = $d *5; echo $e; ?> <form action="test.php" method="post"> <input type="text" name="a"> <input type="text" name="b"> <input type="submit" name="bottun1" value="計算"> </form> 自己流で勝手に書いたので変なことになっていると思います。 エラーの原因は「$d = $a / $c;」でしょうか? 調べてみたら、どうやらゼロ除算というのが問題らしいです。 どうすれば解決できるでしょうか? それともしよろしければ、この様な計算をする場合の正しい書き方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 例外処理と、ハンドルする範囲

    Try Catchや、throws Exceptionを使うべき時についてです。 ・0除算がありうるとき ・DLLや外部EXEを使用するとき、そっちの世界でのエラーをハンドルするとき ・ネットワークエラーや、DBサーバでのエラーをハンドルするとき ・ディレクトリがないとき・ファイルがないとき ・リフレクション?で、型判定・キャストを使用するときに、意図しない型のクラスが渡されてきた場合 などは、ハンドリングしつつ、それ用のエラーページにてエラーを表示しようと思いますが、 (1)みなさんはどのようなものまでハンドリングしていますか? 自分は、 Catch ex As System.xxx.xxxxxxException を何種類も書くメリットが感じられないので、 catch (System.Exception ex) で、上のもの以外のエラーについて、ex.Messageを出力しています。 (2)例外があったとき、エラーページに飛ばさずに、呼び元に扱いを任せる場合は(throwsさせる場合)どう使い分けをしていますか? (3)呼び出された側のクラスの、catch (Exception e)のブロックの中で、エラーページに飛ばしていますか?それとも、一番最初の呼び出し元まで、throws→throws→throws...して、一番最初の呼び出し元からエラーページに飛ばしていますか? .

  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • try~catch

    php初心者です try~catchをわかりやすく教えてください throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか? try~catchを抜けたら、他の処理は普通に実行されるのでしょうか? try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?) try { throw new Exception('エラーが発生しました');  print "hoge"; } catch (Exception $e) {  echo '例外発生', $e->getMessage(), "\n"; }  print "foo"; よろしくお願いします

    • ベストアンサー
    • PHP
  • どの例外でcatchすればいいのですか?

    例外の使い方を理解できていません。 さっき検索してみて下の質問と回答を見つけました。 例外処理がまったくわかりません!! http://www.okweb.ne.jp/kotaeru.php3?q=704380 この中の#2さんの回答、 >    catch (FileNotFoundException e){ ・・・ } >     catch (IOException e){ ・・・ } >   などと分けて書かなくとも、 >     catch (Exception e){ ・・・ } >   と書けば、すべての例外を処理できます。 を読むと「それなら、どんな例外でもすべて"(Exception e)"でcatchすればいいじゃん」と思うのですが駄目ですか? もし駄目ならどんな基準でExceptionを選んでいるのですか? 例えば、下のような二分検索木への挿入メソッドの場合、 どこでどのような例外を使ってcatchすればいいのですか? 私の思うような例外を入れてみましたが、どんなエラーが出るかも分からないし…。 だからと言ってthrow ~ catchを入れないとJBuilderが怒るんですよね…。 public void insert(int el) { IntBSTNode p = root, prev = null; try { while (p != null) { prev = p; if (p.key < el) p = p.right; else p = p.left; } if (root == null) root = new IntBSTNode(el); else if (prev.key < el) prev.right = new IntBSTNode(el); else prev.left = new IntBSTNode(el); } catch (Exception x) { System.out.println("エラーだ! 何か表示"); } } 分かる方、説明をお願いします。

    • ベストアンサー
    • Java
  • 例外処理がまったくわかりません!!

    下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。

    • ベストアンサー
    • Java