• 締切済み

perlのエラー処理

ライブラリ内部で発生したエラーをキャッチする方法がわかりません(>_<) ---------------------------------- #!/usr/bin/perl use XML::AAA; my $aaa = "bbb"; my $ccc = XML::AAA->new($aaa); ---------------------------------- こんなスクリプトを書いたとします。 XML::AAAが、newするときにXML::BBBを使っているとします。 引数が不正でXML::BBBでエラーが発生したときに どうやってそのエラーをキャッチしたらいいかわかりません。 eval{my $ccc = XML::AAA->new($aaa);} if($@){&error_handling;} とやってみても、うまくキャッチできません。 また、$aaaが正しい引数かどうかを確認するのは、ちょっと難しいので、やはり、エラーをキャッチする方向で考えたいです。 ほかにどのような方法があるか教えてください。。

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

みんなの回答

noname#25358
noname#25358
回答No.1

 $ccc に返る値を判別するんじゃなくてですか?  であれば、Perl には例外処理がないので、シグナルをキャッチするしかないんじゃないかと思います。  たとえば、   $SIG{'TERM'} = "terminal";  と宣言すると、TERM シグナルが発生した場合に自動的に terminal(); 関数が呼ばれます。  利用可能なシグナルの一覧を調べるには、   perl -e "$,=qq/\n/;print keys(%SIG);"  をコマンドラインから入力してください。

to_kyo
質問者

お礼

シグナルよくわかっていなくて、 ちょっと調べたくらいじゃ、うまくいきませんでした。 $SIG{'TERM'} = "terminal"; 宣言すると、正常終了のときもterminalがよばれちゃいます。 シグナル勉強する前に if (eval{my $ccc = XML::AAA->new($aaa)}){ } else { &teminal; } とやってみると、なんとなく思惑通りに動いているっぽいので これで進めてみます。

関連するQ&A

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • perl について

    http://AAA/BBB/???/CCC AAAとCCCは固定文字です。 BBBは変化します。 ///の数・順番も固定です。 この状態で、「???」を抜き出してZZZ変数に値を代入するにはどうすれば良いでしょうか? ZZZ=

    • ベストアンサー
    • Perl
  • C#でthisポインタのような感じで渡したい

    こんにちは。 C#で以下のようなことをしようとしましたら 「error CS1605: 読み取り専用なので 'this' は ref または out 引数として渡せません」 とエラーが返されてしまいました。 C++ではthisポインタを渡すことができますが、C#で似たようなことをするには どのようにすればよろしいのでしようか? public class AAA {   public AAA( ref BBB a )   {   } } public class BBB {   public BBB()   {     AAA aaa = new AAA( ref this ) ;   } }

  • xmlの値を配列に格納したいんですけどエラーがでてしまう。

    <?xml version="1.0" encoding="UTF-8" ?> <Dataroot> <aaa> <bbb> <ccc>値1</ccc> </bbb> <bbb> <ccc>値2</ccc> </bbb> </aaa> </Dataroot> ---------------------------------------------------------------- のようなXML文書がある時<ccc></ccc>の値を取り出す場合 ---------------------------------------------------------------- Imports System Imports System.IO Imports System.Xml public class Sample public shared sub Main() Dim doc as XmlDocument = new XmlDocument() doc.Load("data.xml") 'XML文書の読み込み Dim root as XmlElement = doc.DocumentElement Dim nodeList as XmlNodeList nodeList = root.SelectNodes("/Dataroot/aaa/bbb")'/cccまでやる方が簡単 Dim node as XmlNode Dim ccclist() As String = Nothing for each node in nodeList ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し next end sub end class としているのですが ccclist(nodeList.Count) = node.SelectSingleNode("ccc").InnerText '内容の取り出し この行で オブジェクト参照がオブジェクト インスタンスに設定されていません。 とエラーがでて困っています。 これはどのように修正すればよろしいでしょうか? 教えてください。お願いします。

  • エクセルの文字処理

    以前に同じ様な質問があったかも知れませんが、探しきれなかったので教えてください。 A1~A4の4つのセルに以下のスペースが入った文字列が入っていた場合 A1|AAA A2|AAA BBB A3|AAA BBB CCC A4|AAA BBB CCC DDD    A   B   C   D  1|    AAA 2|AAA BBB 3|AAA BBB CCC 4|AAA BBB CCC DDD という具合にしたいのです。 条件は  ・セル内にスペースで区切られない文字列があった場合には、B列に入れる  ・それ以外はスペースで区切って、A列B列C列D列に入れる  ・文字数は3文字固定ではなく全角半角が混在 以上です。すいません宜しく願いします。

  • 【ACCESS】重複チェック方法について

    下記のように、複数フィールドがあり、 フィールド1,2,3が全て同じレコードを抽出したいのですが 抽出する方法があれば、教えてください。 フィールド1 フィールド2 フィールド3 ・・・・ ――――――+――――――――+――――――――+――――― 12345 AAA aaa 12345 BBB aaa 12378 AAA aaa 12378 AAA bbb 23456 CCC bbb 23456 CCC bbb  ―>抽出したい!! 23456 CCC ccc

  • cshで変数名の入れ子ができない

    こんなことをしたいと考えています。 --------------------- set aaa="bbb" set bbb="ccc" echo $aaa echo $bbb echo $($aaa) --------------------- 期待する実行結果としては、 --------------------- bbb ccc ccc --------------------- という感じです。 エラーになってしまうのですが、何かいい逃げ方はありませんか? cshでなくてshでも構いません。 よろしくお願いします。

  • system関数と引数について

    環境 Windows XP VC++6.0, Win32consoleです。 以下のファイルを連続処理させたいのですが、  aaa1.txt、aaa2.txt、aaa3.txt、~~~~aaa.15.txt  bbb1.txt、bbb2.txt、bbb3.txt、~~~~bbb.15.txt  ccc1.txt、ccc2.txt、ccc3.txt、~~~~ccc.15.txt その際、perlで処理させたいと考えております。 VC++ から system関数を用いてperlファイルを動かそうとしていますが、 たとえば、この時 aaa や bbb や ccc を引数として渡せるのでしょうか?

  • perlなんですが、403エラーについて

    サーバーとperlはつい最近はじめた初心者です。 カテゴリーをどちらにしようか悩みましたが、いろいろを試した結果 こちらに質問することにしました。もしかしたらperlの設定かもしれません。もしも間違っていたら申し訳ございません。 サーバーの種類はCentOS Linux 5 バージョン 1.390です。 バーチャルドメインで3つのドメインを管理しています。 一応以下のように仮定させてもらいます。 AAA.com BBB.com CCC.com 末行に書いたテスト用(test.cgi)をBBB.comのディレクトリーに アップしたところ、403エラーになりました。 パーミッションエラーかなと思い、パーミッションの設定をすべて 行いましたが解決できませんでした。 実際にAAA.comでは普通に稼動しているはずなのに、おかしいな~と 思って、その同じスクリプトをBBB.comにアップしたところ、 きちんと表示されました。 そこで、AAA.comの設定をhttp.confからすべて外してBBB.comのtest.cgi を確認したところ、表示されました。 もしかしたら、複数のドメインでperlを使う場合には、 なにか設定を行う必要があるのでしょうか? バーチャルドメインで設定している内容は以下のとおりです。 ※勝手にリンクマークされるのでwww は xxx に置き換えました。 <VirtualHost ***.***.***.***> DocumentRoot /var/xxx/AAA-com ServerName AAA.com HostNameLookups off UseCanonicalName on ScriptAlias /cgi-bin/ /var/xxx/AAA-com/cgi-bin/ <Directory /var/xxx/AAA-com/cgi-bin/> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost ***.***.***.***> DocumentRoot /var/xxx/BBB-com ServerName AAA.com HostNameLookups off UseCanonicalName on ScriptAlias /cgi-bin/ /var/xxx/BBB-com/cgi-bin/ <Directory /var/xxx/BBB-com/cgi-bin/> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> </VirtualHost> テスト用のスクリプトは以下のとおりです。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html><head><title>CGI-Perl TEST</title>\n"; print "<meta http-equiv='content-type' content='text/html; charset=shift_jis'>\n"; print "</head><body><h2>CGI-Perlテスト</h2>\n"; print "</body></html>\n"; exit;

  • bashの関数の引数にスペースが入るとズレる件

    bashの関数の引数にスペースが入るとズレる件 bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。 これを回避する方法はありませんか? ■aaa.sh-Top #!/bin/bash declare FuncPara1 declare FuncPara2 function f_echo() { echo 'uf_echo1='$1 echo 'uf_echo2='$2 echo 'uf_echo3='$3 } echo '---test1---' FuncPara1='aaabbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} echo '---test2---' FuncPara1='aaa bbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} ■aaa.sh-Bottom ■aaa.shの実行 # ./aaa.sh ---test1--- uf_echo1=aaabbb uf_echo2=ccc uf_echo3= ---test2--- uf_echo1=aaa uf_echo2=bbb uf_echo3=ccc このtest2の時に、 ---test2--- uf_echo1=aaa bbb uf_echo2=ccc uf_echo3= となって欲しい。 もしくは、何かしら「なったテイ」で、 引数1の値は「aaa bbb」 引数2の値は「ccc」 と関数側で判断できる方法はありませんか?

専門家に質問してみよう