異常終了処理について

このQ&Aのポイント
  • サーバー異常時の処理方法について質問です。
  • 現在、サーバーに接続できない場合やFTPアカウントやパスワードが異常、ディレクトリ変更時、登録されていないディレクトリ移行、ディレクトリに該当データがない場合の処理終了方法について悩んでいます。
  • 現在のコードでは、サーバー接続が成功した場合にログインし、ディレクトリを変更していますが、他の処理の判断方法がわからない状況です。
回答を見る
  • ベストアンサー

異常終了処理について

サーバーに接続できない場合、FTPアカウントやパスワード異常、ディレクトリ変更時、登録されていないディレクトリ移行をした場合や、ディレクトリに該当データがない場合、それぞれ何もせず処理終了するというルーチンを作りたいのですが、サーバー異常のときは下記のif文を挿入していますが、他の各処理でどのような判断をいれるとよいのかわからないのですが。 現在は下記のように記述しています。 $FTP = Net::FTP -> new($FTPserver) or warn('初回Net::FTP失敗'); # FTP接続 if ($FTP) { $FTP -> login($FTPuser, $FTPpass) or warn('初回login失敗'); # ログイン $FTP -> cwd($FTPdir) or warn('cwd失敗'); # ディレクトリの変更 opendir(DIR, $FTPdir); @FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR)); closedir(DIR);

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • hikomin
  • ベストアンサー率63% (40/63)
回答No.1

warnをdieにすれば、エラーとして終了します。(CGIでCGI::Carp qw/ fatalsToBrowser /;していない場合はServer Errorが表示されます。) 自分でエラー処理を書いても良いです。 sub error{ my $message = shift; print "ERROR: $message"; exit; } $FTP->login($FTPuser,$FTPpass) or error('ログイン失敗); ちなみに、warnは標準エラー出力に書き出す(終了はしない)、dieはエラー出力に書き出して終了、exitは(引数を評価して)終了です。

whitelove
質問者

お礼

ありがとうございます。よくわかりました。

関連するQ&A

  • FTPサーバ(IIS)のファイルをwgetで取得することができません。

    FTPサーバ(IIS)のファイルをwgetで取得することができません。 ※IISの既定のFTPサイト(通常C:\Inetpub\ftproot)直下にftpuser1 というフォルダを作成しておくと、このFTPサイトに ftpuser1でログオンした際、 カレント・フォルダが「/ftpuser1」となります。 1.DOS窓から次のコマンドを入力します。 d:\wget\wget.exe ftp://○.○.○.○/ftpuser1/test.txt --debug --append-output=d:\wget\log.txt --tries=3 --wait=60 --directory-prefix=d:\wget\test --ftp-user=ftpuser1 --ftp-password=ftpuser1 2.失敗したのでログを確認します。 「ftp://○.○.○.○/ftpuser1/」にあるファイルを取得したいのですが、 「ftp://○.○.○.○/ftpuser1/ftpuser1/」を参照しに行ってました。 ↓ログ Logging in as ftpuser1 ... 220 Microsoft FTP Service --> USER ftpuser1 331 Password required for ftpuser1. --> PASS ftpuser1 230 User ftpuser1 logged in. Logged in! ==> SYST ... --> SYST 215 Windows_NT done. ==> PWD ... --> PWD 257 "/ftpuser1" is current directory. done. ==> TYPE I ... --> TYPE I 200 Type set to I. done. changing working directory Prepended initial PWD to relative path: pwd: '/ftpuser1' old: 'ftpuser1' new: '/ftpuser1/ftpuser1' ==> CWD /ftpuser1/ftpuser1 ... --> CWD /ftpuser1/ftpuser1 550 /ftpuser1/ftpuser1: The system cannot find the file specified. No such directory `ftpuser1'. Closed fd 908 ちなみにフォルダ「ftp://○.○.○.○/ftpuser1/ftpuser1/」を作成したところ、 ファイルは取得できました。 なぜ「ftp://○.○.○.○/ftpuser1/ftpuser1/」を参照しに行くのか分かりません。 原因等分かりましたらご教授お願いします。 環境 ・接続先FTPサーバ  Windows Server 2003 R2  IIS 6.0 ・接続元  Windows 2000  wget 1.11.4

  • phpのftp_get()でエラーが出ます。

    今回phpを使ってftp関数であるftp_getを実行してみたところ【Warning: ftp_get(): Error opening】が出てきました。 サイトで調べた結果、パスの指定のミスかパーミッションが原因だと言うことがわかりました。 それから小一時間あれこれ試してみましたがダメでした・・・。 そこで今度はperlを使って同じ内容のスクリプトを書いてみると成功しました。 どなたかphpの方ではなぜ正しく動作出来ないのかをご教示ください。 以下はphpとperlのスクリプトです。 =========================================================================== <?php $FTPSERVER = "!!!"; $FTPUSER = "@@@"; $FTPPASSWORD = "***"; //ftpサーバに接続 $ftp = ftp_connect($FTPSERVER); //ユーザログイン ftp_login($ftp, $FTPUSER, $FTPPASSWORD); ftp_pasv($ftp, true); $srverfile = "test.txt"; $localfile = "data1.txt"; ftp_get($ftp, $localfile, $srverfile , FTP_BINARY); ftp_quit($ftp); ?> ============================================================================ #!/usr/local/bin/perl use Net::FTP; my $host = '!!!'; # 接続先 my $user = '@@@'; # FTPのユーザ my $pass = '***'; # FTPのパスワード my $remote_file = 'test.txt'; # リモートのファイル(これを取得) my $local_file = 'data1.txt'; # ローカルファイル(ここに保存) my $ftp = Net::FTP->new($host) or die "can not connection: $@"; $ftp->login($user, $pass) or die $ftp->message; # ログイン $ftp->binary; # バイナリモードに変更 $ftp->get($remote_file, $local_file) or warn $ftp->message; # ファイル取得 $ftp->quit; # 終了

    • 締切済み
    • PHP
  • 途中で処理が終了してしまう

    OS:Windows2000server AIXからこのマシン上のコマンドスクリプトをキックしています。 内容は以下のようなものです。 ------------------------------------------------------------- ECHO OPEN %FTP_SERVER% >ftpput.ini ECHO %FTP_USER%>>ftpput.ini ECHO %FTP_PASSWORD%>>ftpput.ini ECHO ascii>>ftpput.ini ECHO cd %FTP_DIR%>>ftpput.ini ECHO MPUT C:\DIR\*.txt>>ftpput.ini ECHO BYE>>ftpput.ini exeファイルを実行し、C:\DIRにテキストファイルをセット ftp -i -s:ftpput.ini del ftpput.ini copy C:\DIR\*.txt C:\BK del C:\DIR\*.txt ------------------------------------------------------------- 通常、この一連の処理は問題なく完了するのですが、たまにcopy以下の処理が 実行されなかったり、copyまでは実行されるがdelが実行されなかったりすること があります。 ちなみに、この処理は30分おきに自動稼動していて転送するテキストファイルは 通常きちんと削除されていれば0~3ファイルです。 このような現象が発生してしまうのはなぜでしょうか? お分かりになる方がいましたら、教えて下さい。 よろしくお願いします。

  • 定数専用のファイル

    汎用チャットのソースなど、perlやphpではsetting.plをrequireしたりしてましたが、javaではどのような方法が使われていますか? 設定するのは SERVER_NAME:www.xxx FTPSERVER:ftp.xxx FTPUSER:xxx FTPPASSWD:xxx のようなものです。

  • PHP ftp_fput()関数について

    下記のPHPスクリプトで、JPEGファイルをFTPサーバーにアップしようとしてるんですが、 サーバー側でエラーが出ます。どこが間違っているのか指摘していただけますか? ※ftp_chdir($ftp, $path); の$path は、相対パスか絶対パスか、URLか ※ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)の、第二引数$remoto_file は、リモートでの ファイル名だけでよいのか、相対パスか、絶対パスかURLか ※ちなみに、FTPサーバーへのログインはできてます。 <?php //$photo = "akashi.jpg"; $photo = $_GET['photo']; // FTPサーバーに接続 $ftp_server="users109.lolipop.jp"; $ftp = ftp_connect($ftp_server); //$res = ftp_login($ftp, "root", " "); $res = ftp_login($ftp, " ", " "); if($res==FALSE){ echo("FTPサーバーのログインに失敗しました。"); exit(1); } //$path = "/home/users/1/raindrop.jp-5247423/web/tsukushinbo/upload_photo"; // 絶対パス $path = "../tsukushinbo/upload_photo"; // 相対パス ftp_chdir($ftp, $path); // サーバー側のディレクトリを変更 /* $cur = ftp_pwd($ftp); echo($cur); exit(1); */ // ローカル側でファイルをオープン /* $dir = dirname($photo); // ファイルあるいはディレクトリへのパスを含む文字列を受け取って、 親ディレクトリのパスを返します。 //$filename = $dir."/".$photo; echo($filename); exit(1); */ $fp = fopen("$photo", 'rb') or die; //$fp = fopen("$filename", 'r') or die; // ローカルでオープンされているファイルのポインタ。 ファイルの終端まで進むと読み込みが終了する。 // FTPサーバーに画像ファイルをアップロード $remote_file = $photo; // リモート上でのファイル名指定 if(ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)){ // ローカルでオープンしている画像ファイルをバイナリモードでFTPサーバーにアップロードする echo "Successfully uploaded $file\n"; }else{ echo "There was a problem while uploading $file\n"; } fclose($fp); ftp_close($ftp); //header("Location: bbs.php"); ?>

    • ベストアンサー
    • PHP
  • Net::FTPを使いフォルダ一覧を取得したいと思い以下の参考サイトを

    Net::FTPを使いフォルダ一覧を取得したいと思い以下の参考サイトを発見しました。 http://dqn.sakusakutto.jp/2008/06/perl_netftpftp.html 非常に分かりやすく早速スクリプトを使用して作成しましたがこのスクリプトですと「/」ルート直下の一覧で取得されてしまいます。 (ここから) use Net::FTP; my $ftp = Net::FTP->new("hoge.sav.ne.jpp", Debug => 0 , Passive => "true"); # 接続 $ftp->login("xxxx", "pass"); # ログイン my @dir = $ftp->cwd('/public_html'); my @dir = grep /^d/, $ftp->dir; # ← フォルダ一覧をdirコマンドで取得 my @dir_names_full = @dir[2..$#dir]; #  自フォルダと親フォルダ("."と"..")を除く。 my @dir_names_short = map { (split)[8] } @dir_names_full; # フォルダ名のみを取得 $ftp->quit; (ここまで) $ftp->cwd('/public_html');を追加したのですが、 drwxrwx--- 2 xxxx xxxxx 48 Sep 3 14:59 Maildir drwx---r-x 2 xxxx xxxxx48 Sep 3 14:59 log drwx---r-x 1019 xxxx xxxxx 40584 Dec 28 00:25 public_html となってしまいます。 $ftp->dir;  を $ftp->dir('/public_html'); としてもみましたがうまくいきませんでした。 すみません。ご指導を賜りたく書き込みました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ftp_getできない?

    レンタルサーバの自前のファイルサーバからFTP接続にてファイルを取得しようとしているのですが、エラーとなってしまいます。 FTP接続はできているのですが、ファイルの取得に失敗(FALSE)してしまいます。 レンタルサーバの環境は OS:Linux PHP:4.4.1 試しにftp_nlist関数にてファイル一覧を取得しようとしましたが、やはり失敗(FALSE)してしまいます。 知り合いのレンタルサーバを借用して全く同じプログラムを実行すると正常に一覧の取得ができました。 FTP接続時・ログイン時にはエラーが発生していないのでFTPでの転送は可能だと思うのですが、全くわかりません。 どなたか分かる方ご教授お願いします。 以下、スクリプトです。 if($ftp=ftp_connect($ftp_host)){  if(ftp_login($ftp,$ftp_user,$ftp_pass)){   //ファイルリスト一覧取得    $file_list=ftp_nlist($ftp,".");   var_dump($file_list);   //ファイルダウンロード    if(!(ftp_get($ftp,$local_file,$remote_file,FTP_BINARY))){     エラー処理1;    }   }   else{     エラー処理2;   } } else{  エラー処理3; }

    • ベストアンサー
    • PHP
  • Windows漢字フォルダ名の扱い(chdir編)

    先回、次の質問をさせて頂いた者です。http://oshiete1.goo.ne.jp/qa2230450.html 今回、同様な環境にて、chdir()実行しようとすると、 D:\temp ├─フォルダ名の末尾に機能 ├─フォルダ名の末尾に表 ├─途中に機能がある └─途中に表がある スクリプト内では、次のように書いています(サブルーチン部) sub dir_recurs { my $sdir = @_; my ($d,$rc); my $cwd = Cwd::getcwd(); opendir(DIR,$sdir) || die "$cwd/$sdir") . " $! stopped"; my @dirs=(); my @files=(); foreach(sort readdir(DIR)){ if( -d "$_/" ){ next if(/^\.+/); # '.' '..' はパス push(@dirs,"$_"); }elsif( -f "$_" ){ push(@files,$_); # ディレクトリ以外有り }else{ print "ERROR: '$_' in $cwd.\n"; } } closedir(DIR); #----- 下位ディレクトリへ潜る if(@dirs > 0){ foreach $d (@dirs){ if(!chdir("$d/")){ print "ERROR: chdir($d) from $cwd\n"; next; } $rc = &dir_recurs("."); chdir(".."); } } : 前後関係は、はしょりますが、この処理部が走っているときに、 ERROR: 'temp.txt' in D:\temp\フォルダ名の末尾に機・ ERROR: chdir(フォルダ名の末尾に表) from 'D:\temp' ERROR: chdir(途中に機能がある) from 'D:\temp' ERROR: chdir(途中に表がある) from 'D:\temp' のような結果になってしまいます。 一番先頭でのエラーメッセージを見る限りは、 一度は、「D:\temp」の下の「フォルダ名の末尾に機能」ディレクトリに 潜ることを成功しているようなのですが、次回以降に失敗しています。 この症状について、理由等、お分かりの方、よろしくお願いいたします。

  • ftp_getでローカルにファイルが見当たらない

    下記のようなスクリプトでFTPダウンロードを試みています。 ダウンロード元はホスティング会社のサーバで、 ダウンロード先は私のWindowsPCになります。 接続から読み込みまで万事うまく行き、エラー表示もなく、 Successfully written to C:\test\backup.zip というメッセージが表示されるところまでいくのですが、 C:\test\を開けてみると肝心のファイルが見当たりません。 サーバやPCの設定等もあるかもしれませんが、 どのような原因が考えられますでしょうか? よろしくお願いいたします。 <スクリプト> $local_file = "C:\\test\\backup.zip"; $server_file = "/tmp/backup.zip"; $conn_id = ftp_connect($ftpserver); $login_result = ftp_login($conn_id, $usr, $pass); ftp_pasv($conn_id, true); if(ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)){ echo "Successfully written to {$local_file}"; } else { echo "There was a problem"; } ftp_close($conn_id);

    • ベストアンサー
    • PHP
  • phpのftp_putについて

    はじめましてphp初心者です。 以下の内容を実行した際に うまく行かず困っています。 $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; //サーバーに接続する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 接続できたか確認する if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } ftp_close($conn_id); ローカル、リモート共にファイルの位置は間違っていません。 また以上のように反映させた際に返ってくる答えは 「FTP接続に成功しました。」 「FTPアップロードに成功しました。」 と出てきます。 しかし、ffftpを確認したところ サバー側に変化がありません。 手動ではffftpでアップ可能です。 ご教授お願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう