プログラミング学習中に、なんだかよく分からない英語のメッセージや赤い文字が出てきて、「うわっ、何これ!?」って手が止まってしまうこと、ありますよね。私も昔はそうでした…
この記事では、COBOL初心者の方向けに、エラーメッセージの「解読方法」から「原因の見つけ方」、そして「実際の対処法」まで、まるっと解説していきます。
この記事で学べること
・COBOLのエラーメッセージってそもそも何?
・エラーメッセージの基本的な読み方
・よく見るエラーとその原因
・エラーを直すためのステップ・バイ・ステップ
・デバッグをちょっと楽にするコツ
エラーメッセージが解読不能な暗号から、プログラムを正しく動かすためのヒントに変わる瞬間を、一緒に体験してみませんか? さあ、エラーへの苦手意識を吹き飛ばしましょう!
COBOLのエラーメッセージとは?まず基本を理解しよう
COBOLプログラミングをしていて出会うエラーメッセージ。
これは、プログラムがコンピュータに理解してもらえなかったり、実行中に何か問題が起きたりした時に、「ここ、ちょっとおかしいよ!」と教えてくれる合図のようなものです。
大きく分けて、2つのタイミングで発生します。
1. コンパイル時エラー
これは、人間が書いたCOBOLのコード(ソースコード)を、コンピュータが理解できる言葉(機械語)に翻訳(コンパイル)する時に見つかるエラー。文法の間違いや、単語のスペルミスなどが主な原因です。プログラムを実行する前に見つかるので、比較的修正しやすいことが多いです。
2. 実行時エラー
コンパイルは無事に通ったものの、プログラムを実際に動かしてみた時に発生するエラー。計算結果がおかしくなったり、ファイルがうまく読み書きできなかったり、予期せぬ動作をしてしまったり…。こちらは、プログラムの「ロジック(処理の流れ)」に問題があることが多いです。
どちらのエラーも、決して怖いものではありません。
むしろ、プログラムの間違いを早期に発見し、正しく動くプログラムを作るための道しるべになってくれる、ありがたい存在なんです。メッセージをしっかり読み解けば、必ず解決の糸口が見つかりますよ。
COBOLエラーメッセージの基本的な「読み方」
さて、エラーメッセージが出た時、どこを見ればいいのでしょうか? コンパイラ(翻訳機)の種類によって表示は少しずつ違いますが、だいたい次のような情報が含まれています。
- エラーが発生した行番号
- ソースコードの何行目で問題が起きているかを示します。まず真っ先に確認したい超・大事な情報です!
- エラーメッセージ本文
- エラーの内容を説明する文章です。英語で表示されることが多いですが、キーワードを拾って読むだけでも原因の推測に役立ちます。
- エラーコード/番号
- エラーの種類を示す固有の番号や記号。マニュアルなどで調べると、より詳しい情報が得られる場合があります。
- 重要度レベル
- エラーの深刻さを示す情報(例: W=Warning(警告), E=Error(誤り), S=Severe(重大な誤り)など)。Error以上は基本的に修正が必要です。
例えば、こんな感じのエラーメッセージが出たとします。(あくまで例です)
IGYPS2072-E LINE 000015 UNDEFINED IDENTIFIER "WS-NAME".
この場合、
- 行番号 → 15行目
- エラーメッセージ本文 → UNDEFINED IDENTIFIER "WS-NAME". (未定義の識別子 "WS-NAME")
- エラーコード/レベル → IGPS2072-E (EなのでErrorレベル)
といった情報が読み取れます。これで、「15行目あたりで、WS-NAMEという名前の何かが定義されていないらしいぞ」と見当をつけることができるわけです。
まずは落ち着いて行番号を確認し、メッセージ本文を読むクセをつけましょう!
よく遭遇するCOBOLのエラーメッセージと具体的な対処法
ここからは、初心者の皆さんが特によく出会うであろう、代表的なエラーメッセージとその対処法を見ていきましょう!
エラー例1:データ項目未定義 (例: UNDEFINED IDENTIFIER)
これは本当によく見るエラーの一つですね。「そんな名前のデータ項目(変数)、知らないよ!」とコンピュータに言われている状態です。
主な原因
- データ項目(変数)を
DATA DIVISION
のWORKING-STORAGE SECTION
などで宣言し忘れている。 - 宣言はしたけど、使う場所で名前のスペルを間違えている。(例:
WS-NAME
と宣言したのにWS-NEME
と書いている)
対処法
- エラーメッセージで指摘された名前が、
DATA DIVISION
でちゃんと宣言されているか確認しましょう。 - 宣言されている場合、エラーが出ている行で使っている名前のスペルが、宣言した時のスペルと一字一句同じか、じーっくり見比べてみてください。大文字・小文字の違いや、ハイフン(-)の有無などもチェックです!
タイプミスは誰にでもあること。焦らず確認すれば大丈夫です。
エラー例2:文法エラー (例: SYNTAX ERROR NEAR 'XXX')
「この辺りの書き方、COBOLのルールと違うみたいだよ」というエラーです。'XXX'の部分には、エラー箇所の近くにある単語が表示されることが多いです。
主な原因
- 文の最後に必要なピリオド(.)を忘れている、または不要な場所につけている。
- COBOLで特別な意味を持つ単語(予約語:
MOVE
,IF
,PERFORM
など)をデータ項目名として使おうとしている。 - コードを書く場所(A領域/B領域)を間違えている。
- 全角スペースが紛れ込んでいる。
対処法
- エラーメッセージが示す行番号とその周辺を、COBOLの基本的な書き方ルールに照らし合わせてチェックします。特にピリオドの使い方は要注意です。
- 予約語をデータ項目名にしていないか確認しましょう。
- インデント(字下げ)が正しく行われ、A領域/B領域のルールを守れているか確認します。
- 目に見えない全角スペースが原因のこともあるので、怪しい箇所は半角スペースで入力し直してみるのも手です。
エラー例3:PICTURE句の記述ミス・不一致 (例: INVALID PICTURE STRING, MISMATCHED DATA TYPES)
データ項目(変数)の性質(数字なのか文字なのか、桁数はいくつかなど)を決めるPICTURE
句に関するエラーです。
主な原因
PICTURE
句の書き方自体が間違っている(例:PIC 9(3
で閉じ括弧がない)。MOVE
文などで、性質の違うデータ項目間でデータを移そうとしている(例: 数字項目(PIC 99
)に文字('ABC'
)を入れようとする)。
対処法
DATA DIVISION
で定義したPICTURE
句の書き方が正しいか、基本的なルール(9
は数字、X
は英数字、A
は英字、V
は小数点など)に沿っているか確認しましょう。MOVE
文などのデータ転記命令で、転送元と転送先のデータ型(PICTURE
句で定義した性質)が合っているか確認します。型が違う場合は、必要に応じてデータ型を変換する処理を入れるか、定義を見直す必要があります。
データの「形」を意識するのがポイントです!
エラー例4:表(TABLE)の添え字範囲外 (例: SUBSCRIPT OUT OF RANGE)
OCCURS
句を使って定義した「表(配列のようなもの)」の、範囲外の要素にアクセスしようとした時に発生します。「その番号の箱は用意してないよ!」というエラーです。
主な原因
OCCURS 5 TIMES.
のように5個分の箱しか用意していないのに、6番目や0番目の箱を使おうとしている。- ループ処理(
PERFORM VARYING
など)で、表の要素数を管理する変数(添え字)が、意図せず範囲を超えてしまっている。
対処法
- まず、
OCCURS
句で定義した要素数を確認しましょう。 - エラーが発生している箇所で、表の要素を指定している変数(添え字)の値がいくつになっているか確認します。
DISPLAY
文などで添え字変数の値を表示させてみると分かりやすいでしょう。 - ループ処理で添え字を操作している場合、ループの開始値、終了値、増減値が正しいか、表の要素数の範囲内に収まっているかを確認します。
例えば、OCCURS 5 TIMES.
と定義した表 (配列) があるとします。
要素1 [ ]
要素2 [ ]
要素3 [ ]
要素4 [ ]
要素5 [ ]
この場合、アクセスできるのは1番目から5番目まで。もし6番目や0番目にアクセスしようとすると「添え字範囲外」エラーになってしまうのです。
エラー例5:ファイル処理関連のエラー (例: FILE STATUS 'XX')
ファイルのOPEN
、READ
、WRITE
、CLOSE
といった処理で問題が発生した場合、FILE STATUS
句で指定したデータ項目に2桁の状況コード(ファイルステータス)がセットされます。これが '00' (正常終了) 以外の場合、何らかの問題が起きています。
主な原因と代表的なコード
- '00' : 正常終了 - 問題なし!
- '10' : AT END (ファイルの終わりに達した) -
READ
文で、もう読み込むデータがないのに読み込もうとした。これはエラーというより正常な終了状態を示すことが多いですが、考慮漏れがあるとエラーになる場合も。 - '30' : PERMANENT ERROR (永続エラー) - ファイル定義自体に問題がある、OSレベルで何か問題があるなど、回復が難しいエラー。定義やJCL(実行環境の設定)を見直す必要あり。
- '35' : FILE NOT FOUND (ファイルが見つからない) - プログラムがアクセスしようとしたファイルが存在しない。ファイル名やパスが正しいか、ファイルが所定の場所にあるか確認。
- その他にも様々なコードがあります。
対処法
- ファイル処理(特に
READ
やWRITE
)の直後に、必ずファイルステータスの値を確認する処理を入れましょう。 - '00' 以外の場合は、そのコードの意味を調べ、原因に応じた対処を行います。(例: '10'ならループを抜ける、'35'ならエラーメッセージを出して処理を中断するなど)
ENVIRONMENT DIVISION
のINPUT-OUTPUT SECTION
やFILE SECTION
でのファイル定義、JCLなど実行環境の設定が正しいか確認します。
*> 簡単なファイルステータスチェックの例 READ INPUT-FILE AT END MOVE '1' TO WS-EOF-FLAG. IF FS-STATUS NOT = '00' AND FS-STATUS NOT = '10' DISPLAY 'ファイルエラー発生: ' FS-STATUS * ここでエラー処理を行う (例: STOP RUN.) END-IF.
ファイル処理は、FILE STATUS
のチェックが欠かせません!
COBOLのエラーメッセージのデバッグを効率化するほう法
エラーメッセージとにらめっこする時間を少しでも短縮するための、ちょっとしたコツを紹介しますね。
コンパイラリストを活用する
DISPLAY
文で途中経過を見る
DISPLAY 変数名.
を入れて実行してみましょう。変数の変化を追うことで、ロジックの間違いを見つけやすくなります。原始的ですが、とても有効な方法です!コードを小分けにして試す
声に出して読んでみる
色々な方法を試して、自分に合ったデバッグスタイルを見つけてみてください。
COBOLのエラーメッセージへの対処法を知る上での注意点
エラーメッセージは万能ではありません。いくつか心に留めておきたい点があります。
メッセージが示す場所と真の原因が違うことも
コンパイラや環境による違い
1つ直したら別のエラーが…
マニュアルやリファレンスを見る習慣を
エラー解決は、時に根気が必要な作業。でも、その分、解決できた時の達成感は格別ですよ!
【まとめ】COBOLのエラーメッセージを恐れず、スキルアップへ繋げよう!
今回は、COBOLのエラーメッセージについて、基本的な考え方から読み方、よくあるエラーの原因と対処法、そしてデバッグのヒントまでお伝えしてきました。
最初は難解に見えるエラーメッセージも、その「読み方」と「パターン」を知れば、決して怖いものではありません。むしろ、プログラムをより良くするための重要な手がかりです。
この記事でお伝えしたこと
- エラーはプログラムを正しくするための方法
- まずは行番号とメッセージ本文をチェック
- よくあるエラーには原因と対処法のパターンがある
- ファイル処理はファイルステータス確認が必須
DISPLAY
文などのデバッグ技も活用しよう
エラーが出るたびに、「よし、原因を見つけてやるぞ!」という気持ちで向き合ってみてください。一つ一つのエラー解決が、着実にあなたのCOBOLスキルを向上させてくれるはずです。
エラーを恐れず、どんどんコードを書いて、どんどんエラーを出して(笑)、そしてどんどん解決していきましょう!応援しています!
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。