11.1. タイムアウト処理」カテゴリーアーカイブ

11.1. タイムアウト処理を入れる

11.1. タイムアウト処理

いよいよマクロも複雑になり、例外処理が必要な状況になってきました。 例外処理というのは簡単に言うと、「変な事が起きた時の動作」ということになります。 プログラムやマクロはいつもいつも想定通りに動くとは限らず、結構な確率で変な事が起きるのです。 結構な確率で変なことが起きるくせに、変な事が起きるたびにマクロが止まっていたのでは、どうしようもありません。 そこで、例外処理というのが必要になってきます。  

11.1.1. タイムアウトとは

タイムアウトとは、「今やってることを諦める」という動作のことを言います。 例えば、

  というコマンドを書いていた場合、画面上に#が現れなかったり、取りこぼしたりしてしまうと、マクロはずっとwait “#”で止まってしまいます。 止まってしまうといつまでも次の処理には進めないので、マクロも停止せざるをえません。 それだと効率が悪いので、「ある程度の時間が経つと諦めていいよ」というのをマクロに教えるのがタイムアウトです。  

11.1.2. タイムアウトのコマンド

タイムアウトは非常に簡単に書くことができます。

これで、秒数分の時間が経過したら次の処理に行きなさいね、ということをマクロに教えることができます。 ただし、タイムアウトを認識してくれるコマンドは限られていて、wait系のコマンドか、 recvlnコマンドだけです。 以下が、timeoutを認識するコマンドです。 recvln, wait, wait4all, waitevent, waitn, waitln, waitrecv, waitregex  

11.2. タイムアウトを入れる

それでは、実際に例外を起こして、タイムアウトの動作を見てみたいと思います。  

11.2.1. タイムアウトがないときの動作

まずは、timeoutを入れずに、「変なこと」を人為的に起こして、どうなるかを見てみたいと思います。 下記はこれまでに作成したマクロです。

 

96行目で

  で>が表示されるのを待っています。 ここでわざと、表示されるはずのない<を待ってみることにします。 以下のように書き換えてみます。

  これで、実際に動かしてみましょう。

スクリーンショット 2014-12-11 19.56.38

この画像のように、ずーっと

  のままで停止しています。 これは、マクロが表示されるはずのない<を永久に待とうとしているからです。 これでルータがtelnetタイムアウトをしてくれば、エラーとなって処理が終了することになります。  

11.2.2. タイムアウトを投入

では、実際にtimeout処理をマクロに組み込んでみます。 今回はタイムアウトまでの時間を10秒に設定します。 先ほどのずーっと待つ状態と比べてどうなるかを見てみます。

  この画像のように、次のステップに進んでいますね。

スクリーンショット 2014-12-11 20.00.23

これは10秒間だけ、<が表示されるのを待って、10秒経ったので、諦めたということになります。]]>