- PR -

別クラスからのException catchについて

投稿者投稿内容
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2008-07-17 12:31
こんにちわ。

えっと。。。
catch (Exception ex) は例外情報を編集したい場合かと。

throw ex; は再throwしたい場合、そこで発生した例外情報を投げる為、
throw;   は何もせずそのまま発生した例外情報を投げる。。。
でしょうか。

うぅ・・・正直よく理解できないです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-17 21:54
 ではまず、例外を、なんのために使用しているのでしょう?
ここで、"EPSON Printer" という名前を付けられたプリンタを探していますが、この名称のプリンタは、恒久的に存在しているものなのでしょうか。

 .NET Framework の例外を、何らかの検査のために使用するのは避けるべきです。
「何らかの検査」とは、入力された文字列が規定のフォーマットに従っているかなど、何らかの都合によってエラーとなる状態であることが頻繁に起こりえる事の検査を指します。
 今回のケースで、「必ず EPSON Printer という名前のプリンタでなければならない」のであるなら、例外を使用するのもまたよしでしょう。
私は、「FAX や Document Writer のようなファイルに出力するものじゃなくて、印字してくれるプリンタだったらなんでもええんじゃね?」と思ったのですけど。

 さて、catch と catch (Exception ex) の違いですが、catch だけだと、すべての例外を捕捉します。しかし、例外情報にはタッチできません。
catch (Exception ex) だと、Exception クラスから導出された例外について捕捉し、ex 変数によって情報にアクセスすることが可能です。

 次に throw ex; と throw; の違いについてですが、catch ブロックにおいて、捕捉した例外をそのまま再送出したいのであれば、throw; でなければなりません。
throw ex; とすると、上位で捕捉したときに、例外の発生場所が変わってしまいます。
throw の直後に new Exception(); と書くのと、いったん ex という変数に受けた後、throw ex; と書くのでは、行数が違うとか途中で例外情報を操作できるといった違いしかありません。
気をつけなければならないのは、「throw は関数ではない」ということです。

 オンラインの MSDN には、注釈を入れていますから、ご覧ください→try-catch (C# リファレンス)<microsoft.com>

 で、本題。2008-07-15 21:25 の投稿文をもう一度見てみると、
引用:
コード:
try
{
    // Print PDF file
    CommonFunction.PrintProcess(filePath);

}
catch
{
    throw; A←ここまでメッセージを引継ぎたい
}
finally
{
}


コード:
try
{
    // Exist printer
    (略)
    if (!printFlg)
    {
        throw new Exception("プリンターが見つかりません!"); @
    }
    (略)
}
catch (Exception ex)
{
    throw ex;
}
finally
{
    (略)
}



となっています。注目は、2、catch 句の方です。
これらの投稿を、無視されましたよね?
引用:

なちゃさんの書き込み (2008-07-15 21:59) より:
とりあえず、今現在Aのところでどうやってメッセージを取り出そうとしてるのか書いてみてください。

それともそもそもメッセージの取得の仕方自体がわかってないということでしょうか?
もみ消されるとは、具体的にはどういう状態を言っていますか?
「オブジェクトが参照状態にありません」のようなエラーとは、具体的に何をしたときにどこに表示されているものですか?


引用:

まりもさんの書き込み (2008-07-15 23:30) より:
大変あてずっぽうなのでたぶん違うとは思うのですが、

Aのところを、

catch (Exception ex)
{
throw;
}

としたら何とかなったりしませんか?


引用:

Jittaの書き込み (2008-07-16 08:40) より:
catch していないものを表示することは、当然できませんね。


 送出や再送出は関係なく、2の方が、catch のみのため、どうやってメッセージを参照しようとしているのか。それがとても疑問です。
1の方は元のコードのまま、2の方を
コード:
try {
    ...
} catch (Exception ex) {
}


とすれば、メッセージが参照できるでしょう?
ついでに、 catch 句は必ず必要というわけではありません。

スキルアップ/キャリアアップ(JOB@IT)