このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

AppleScriptのエラー?(-1700)

発言者:西田明美
( Date Thursday, October 23, 1997 16:43:38 )


こんにちは、始めまして。西田と申します。
必要に迫られて、AppleScriptでCGIプログラムを作らなければなり、
途方に暮れていたところ、田中さんのCGI Kitの存在を知り、使わせて
頂いています。大変助かっています。どうもありがとうございます。
ところがAppleScriptのエラーがどうしても解決できず困っています。

フォーム上で入力された情報をファイルに書き出し、その情報の一部を
メールで担当者に知らせる、というCGIを田中さんのguestMail2.acgiと
guestmsg.acgiを改造して作っています。改造といってもフォーム項目
が変わった部分をカストマイズして、必要な処理の部分をドッキングさせ、
一つのスクリプトにしているだけです。
このACGIを実行させたところ、「ACGIからの実行結果の受信に謝りが
起きました(-1700)というエラーが出ます。ですが、入力内容は
ファイルに書き込めているし、メールも送られているので、私が
させたいことは一応ちゃんと処理されています。このエラーは
どの処理のタイミングで出されているんでしょうか?また
対処法などがありましたら、教えてください。

guestMail2.acgiはNetEvent版を使用しています。サーバは
WebSTAR2.0Jです。


田中求之 さんからのコメント
( Thursday, October 23, 1997 16:57:07 )

>ですが、入力内容は
>ファイルに書き込めているし、メールも送られているので、私が
>させたいことは一応ちゃんと処理されています。このエラーは
>どの処理のタイミングで出されているんでしょうか?

とすれば、処理のかなり最後の部分でエラーが起きている可能性が高いですね。

CGI の処理の最後には、必ずサーバーに対してページのデータ(あるいはリダ
イレクトの指示)を返さなければなりませんが、この部分はどうなっていますか?

西田明美 さんからのコメント
( Friday, October 24, 1997 09:27:29 )

回答ありがとうございました。
send_messageから復帰した後の処理は元のスクリプトをいじっていません
ので、サーバーにページのデータを返す処理を行っていますが、この
処理が実行されている気配はありません。send_messageがエラー復帰
しているような気もしているのですが。
どこの処理でエラーが出ているかデバッグする方法はありますか?
怪しい部分にdisplay dialog文を入れて、スクリプトがどこまで実行
されているか確認するというようなことをするのでしょうか?

田中求之 さんからのコメント
( Friday, October 24, 1997 14:08:33 )

エラーを捕まえるには、try / on error を使います。

CGI KIt のものには、ちゃんとエラーが起きたら、エラーの内容をページとして
表示するようなスクリプトをかいてあるのですが、これがちゃんと機能していない
のかな?

メールが送れているということは、send_message ハンドラーを呼び出すところ
まではちゃんと処理が行われているということですよね?

スクリプトの最後の部分は

    set theResult to send_message(myMailAddr, "Message from Guest", myData)
    
    if "ERROR" is in theResult then
      error theResult
    end if
    
    --- リプライ
    return http_10_header & "<TITLE>Thank You</TITLE>" & crlf ツ
      & "<h2>メッセージをありがとうございます</h2>" & crlf ツ
      & "今後ともよろしくお願いします"
    
  on error errMsg number errNb
    
    return http_10_header & crlf ツ
      & "<TITLE>Error</TITLE>" & crlf ツ
      & "<h1>Error</h1>" & crlf ツ
      & "<h3>処理中にエラーが生じました</h3><HR><P>" & errMsg
  end try
  
end ヌevent WWWスsdocネ

のままですか? send_message がエラーを起こしている場合には、 on error
以下に処理が移って、「処理中にエラーが生じました」というページを表示する
はずなんですが?

田中求之 さんからのコメント
( Friday, October 24, 1997 14:10:19 )

あ、もしかしたら、

 on error errMsg number errNb
    
を

 on error errMsg
    
に書き換えてみてください( number errNb を削る)

西田明美 さんからのコメント
( Friday, October 24, 1997 14:36:56 )

on error errMsg number errNb
を
on error errMsg
に書き換えるとうまくいきました。
どうもありがとうございました。
なぜ、このように書き換えるとうまくいけたのでしょうか?

田中求之 さんからのコメント
( Friday, October 24, 1997 18:31:24 )

「うまくいった」というのは、ちゃんとエラーが表示された、ということですよね?

send_message ハンドラーがエラーを起こした場合のエラーメッセージのパラメーター
と、on error の部分のパラメーターの整合性がとれていなかったため、エラー処理自
体がエラーになっていたわけです (^_^;;


西田明美 さんからのコメント
( Monday, October 27, 1997 10:33:51 )

中途半端な書き方をしてしまいました。すみません。
「うまくいった」というのは、CGIの処理が正常に行われ、処理が正常に終了
したことを通知するページがちゃんと表示されたということです。
もし的を外していたらすみません。send_messageハンドラーの復帰後に 
if "ERROR" is 〜という処理がありますが、この行は実行されていない
ようなので、send_messageハンドラーは正常復帰している。
ということは、田中さんがコメントされている、エラー処理のエラーが
サーバに通知されていたということでしょうか?

田中求之 さんからのコメント
( Wednesday, October 29, 1997 22:34:42 )

あら、スクリプトがエラーなく動いたということだったんですね。

だったら、なんで、あの変更で動いてしまうのか… 謎ですが、まぁ、動いたのだから
よしとしましょう (^_^;;


西田明美 さんからのコメント
( Thursday, October 30, 1997 10:44:04 )

今もCGIは期待どおりの動きをしてくれています。いろいろありがとう
ございました。謎といえば、「申」という漢字を変数に代入しようとすると、
必ず、構文チェックでエラーになります
例えば、set guestName to "申請者"と書くと 「Expected ”"”but found
unknown token」と必ずなります。最初に「申」という漢字を使うと
だめなようです。多分、漢字コードのせいだと思うのですが、最初はこのことに
気付かず、なんでエラーなの??と頭をかかえていました。

田中求之 さんからのコメント
( Thursday, October 30, 1997 13:33:36 )

>「申」という漢字を変数に代入しようとすると、
>必ず、構文チェックでエラーになります

日本語(SJIS)の2バイト目の文字が \ に相当する漢字ではこのエラーがおきちゃう
んですよ。

AppleScript では、\ をエスケープ文字として使用しますよね? たとえば文字列の
中に引用符をいれたいときには

 "He said \"Hello\""

といった書き方をします。このように、\ という文字に特別な役割があるんですが、
日本語の漢字の中には、2バイト目が \ になっている文字がいくつかあるため、
問題が起きてしまうのです。

set myTitle to "予定表"

なんてスクリプトをコンパイルしようとするとエラーになるのもこのためです。
(「予定表」を英語フォントで表示すると、予と表に \ が含まれていることが
わかります)

で、対策としては、エラーを起こす字の後ろに \ を追加してやります。

set myTitle to "予\定表\"

こうすると、エラーが無くなって、思っている通りの文字列が得られます。

狩野正嗣 さんからのコメント
( Friday, October 31, 1997 07:36:39 )

 簡単な説明が以下のページにあります (^ ^)


→  スクリプト中の文字列に関する注意