  1 # ケース３修正版
  2 
  3 from datetime import datetime, date
  4 
  5 ### 例外の定義 ###
  6 class MyBaseEx(Exception):
  7     def __init__(self, msg="", line_num=0, line=''):
  8         self.msg = msg
  9         self.line_num = line_num
 10         self.line = line
 11 
 12     def info(self):
 13         print(self.msg)
 14         print(self.line_num, ' -> ', self.line)
 15 
 16 class MyException(MyBaseEx):
 17     pass
 18 
 19 class MyLineEx(MyException):
 20     pass
 21     
 22 class MyWordEx(MyException):    ←例外を定義
 23     pass
 24 
 25 class MyFatal(MyBaseEx):
 26     pass
 27 
 28 class MyLineFatal(MyFatal):
 29     pass
 30 
 31 class MyWordFatal(MyFatal):
 32     pass
 33 
 34 ### 処理本体 ###        
 35 def case3_mod():
 36     print('=== Start case3 mod ===')
 37 
 38     # チェックモードの定義
 39     CHECK_MODE_NONE = 0
 40     CHECK_MODE_WARN = 1
 41     CHECK_MODE_FATAL = 2
 42 
 43     # 動作設定
 44     check = CHECK_MODE_FATAL
 45     line_limit = 10
 46     word_limit = 0
 47 
 48     
 49     line_num = 0
 50     word_total = 0
 51     err = 0
 52     
 53     try:
 54         #ファイルを開く
 55         with open('input_case3.data', 'r') as f:
 56             # １行読み、行処理のループ
 57             for line in f:
 58                 try:
 59                     if line_limit > 0 and line_num == line_limit:
 60                         if check == 1:
 61                             raise MyLineEx('読み込み行数が制限値を超えたので後続の行は無視します', line_num, line)
 62                         elif check == 2:
 63                             raise MyLineFatal('読み込み行数が制限値を超えたので プログラムを終了します', line_num, line)
 64 
 65                     line_num += 1
 66                     word_num = 0
 67     
 68                     w = line.split()
 69                     line_total = 0
 70                     # 単語処理のループ
 71                     for v in w:
 72                         if word_limit > 0 and word_num == word_limit:
 73                              if check == CHECK_MODE_WARN:
 74                                  raise MyWordEx('１行当たりの上限数を超えたので超えた部分を無視します', line_num, line)
 75                              if check == CHECK_MODE_FATAL:
 76                                  raise MyWordFatal('１行当たりの上限数を超えたのでプログラムを終了します', line_num, line)
 77 
 78                         word_num += 1
 79                         #数値でない→エラー
 80                         try:
 81                             #数値化
 82                             d = int(v)
 83                         except:
 84                             d = 0
 85                             if check == CHECK_MODE_WARN:
 86                                 line_num -= 1
 87                                 raise MyWordEx('エラーのあった行は無視します', line_num, line)
 88                             if check == CHECK_MODE_FATAL:
 89                                 raise MyWordFatal('エラーがあったのでプログラムを終了します', line_num, line)
 90 
 91                     # 単語処理のforループ内でbreakしな勝った場合は、ここが実行されcontinue
 92                     word_total += word_num
 93                 
 94                 except MyLineEx as e:
 95                     e.info()
 96                     break
 97                 except MyException as e:
 98                     e.info()
 99                     
100     
101     
102         print('行数：', line_num)
103         print('単語数：', word_total)
104         print('平均単語数：', word_total / line_num)
105 
106     except MyFatal as e:
107         e.info()
108         
109     
110     print('=== Finish case3 mod ===')
111 
112 
113 # メイン
114 if __name__ == "__main__":
115     case3_mod()
