プログラミングと工作と

PythonとかPascalとかAVRマイコンとか、コンパイラつくったり電子工作なんかを楽しんでいるおっさんの記録

Pythonでプログラムを停止する方法を覚えた。

もうひとつ、最近覚えたことをメモしておきます。

それは、エラークラスを呼び出してエラー表示を実行したら、そこでプログラムを終了させる方法です。

分割する前は、エラー関数の最後でソースファイルをクローズしていました。
ファイルをクローズするので構文解析はストップするのですが、後の関数がクローズしたファイルを読もうとするので例外エラーをPythonが吐き出していました。

かっこ悪いけどあとで何とかしよーと思っていたのですが、ファイル分割するとエラークラス側のファイルでメインプログラムで開いたソースファイルをクローズ出来なかったので、プログラム停止の方法を探しました。

その方法は、import sys でsysをインポートして、
「sys.exit()」で停止する、というものです。

.exit()の引数には、整数 0(デフォルトは0)を入れるとシステムは「正常終了」として扱うそうです。
0以外の整数を「異常終了」として扱いますが、どんな値でどんな動作をするかはシステム次第らしく、一般には未定義との事。
要は、エラー発生時には sys.exit("エラーメッセージ") と書くと簡単にプログラムを終了することができます。

で、停止命令を加えたのが次のファイル

#!/usr/bin/python
# coding: utf-8

import sys

class err:
    
    def error(self, er):
        if er == 1:
            e = u" 突然ファイルの終端になっています"
        elif er == 2:
            e = u" }はトークンの始まりには出来ません"
          ・
          ・ 途中省略
          ・
        elif er == 21:
            e = u" プログラム名がないよ!"
        elif er == 22:
            e = u" 'end.'の後になんか文があるよ!"

        #infile.close()
        print("")
        print('Error' + str(er) + e)
        sys.exit('***コンパイルを停止します***') #←ここ!

で、エラー発生させた実行結果が↓

~/PasAvr$ python parser02.py
program test;
const
    yes = true;
    no = false;
    small = 0
    big
Error8 ';'セミコロンが抜けていませんか?
***コンパイルを停止します***
~/PasAvr$

とか

~/PasAvr$ python parser02.py
program test;
const
    yes = true;
    no = false;
    small = 0;
    big = 123456;
var
    id1 : integer;
    true
Error9 ここは'begin'か非キーワードのくるところ!
***コンパイルを停止します***
~/PasAvr$

昨日と、停止するときの表示を変えました。
Pythonがエラーを吐き出すことなく停止するようになりました!