- PR -

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

投稿者投稿内容
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2008-07-15 23:30
大変あてずっぽうなのでたぶん違うとは思うのですが、

Aのところを、

catch (Exception ex)
{
throw;
}

としたら何とかなったりしませんか?
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-07-16 03:05
throw new EpsonPrinterException("エラーだよ");

とかやらんの?

分かってるならありかもしれないけど分かってないのだから
何でもキャッチとまた投げは良くない。

捕まえる方が良い部分では、EpsonPrinterException 例外だ
けを捕まえてその他は無視するか上位の実装に委ねる。


コード:

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



C# ってゆーのはこーゆー書き方も出来るのだ、かもしれませんが、
なれないうちは手抜きみたいな書き方しないほうがよろしいと。

コード:

Public Class EpsonPrinterException : Inherits Exception
Public Sub New(ByVal s As String)
MyBase.New(s)
End Sub
End Class

Public Class PrinterCore : Implements IDisposable

Private disposedValue As Boolean = False ' 重複する呼び出しを検出するには

' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
Console.WriteLine("共有リソースの開放")

End If

Console.WriteLine("アンマネージリソースの開放")

End If
Me.disposedValue = True
End Sub

#Region " IDisposable Support "
' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
Public Sub Dispose() Implements IDisposable.Dispose
' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region

End Class

Public Class EpsonPrinter

Public Shared Sub Print(ByVal file As String)

Try
Using pc As New PrinterCore
Throw New EpsonPrinterException("エプソンエラーです")
End Using

Catch ex As Exception
Throw ex ''ココ
End Try

End Sub

End Class

''--------------
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
EpsonPrinter.Print("ファイル名")

Catch ex As Exception
Console.WriteLine(ex.StackTrace)
Console.WriteLine(ex.Message)
End Try
End Sub




VBだけど、こーすると、EpsonPrinterException のとこでエラー出しているのに
スタックトレースは 当然 "ココ" ですね。実際に出たところとエラー内容にくい
違いがでます。

もみ消しとはこーゆーことではなくて?

訂正:InnerException てのがあるんですね。知らんかった。
こいつが null参照になりますね。要するにまた投げするときに引き継げば
いいってことかな?

Throw New Exception("その他エラーに入り・・・", ex)

また投げするときはこー書けばいいのね。


[ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-07-16 03:20 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-16 08:40
例外の再送は、throw だけです。
catch していないものを表示することは、当然できませんね。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-07-16 13:03
本題とは関係ない…かどうかはわかりませんが、

引用:

Liquid_Forceさんの書き込み (2008-07-15 21:25) より:

コード:
                // Exist printer
                foreach (string printerName in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    if (printerName.Equals("EPSON Printer"))
                    {
                        printFlg = true;
                        break;
                    }
                }

                if (!printFlg)
                {
                    throw new Exception("プリンターが見つかりません!"); @
                }




そもそもここは、例外を使う場面ではないと思います。
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2008-07-16 17:05
みなさん、ありがとうございました。

throw new Exception("プリンターが見つかりません!");

を catch してさらに throw していた為にメッセージが
なくなっていたようです。try〜catch の外で throw したら
上までメッセージが引き継がれました。

コード:
            // Exist printer
            foreach (string printerName in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                if (printerName.Equals("EPSON Printer"))
                {
                    printFlg = true;
                    break;
                }
            }
      ◆tryの枠外に移動◆
            if (!printFlg)
            {
                throw new Exception("プリンターが見つかりません!"); @
            }

            try    ←ここにtryを移動
            {
                printProcess.StartInfo.FileName = "Acrobatのパス";
                printProcess.StartInfo.Verb = "open";
                printProcess.StartInfo.Arguments = " /n /t " + printFile;
                printProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                printProcess.StartInfo.CreateNoWindow = true;
                printProcess.Start();
                // wait time two secound
                printProcess.WaitForExit(2000);
            }
            catch (Exception ex)
            {
                throw ex;
            }

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-16 20:04
(´?ω?`)
違うよ
Liquid_Force
大ベテラン
会議室デビュー日: 2003/08/28
投稿数: 102
投稿日時: 2008-07-16 20:07
あれ?
やっぱり強引ですか。
理解不足でやった対応なので違いますよね。
もっと調べてみます。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-07-17 07:24
catch (Exception ex)
としているところと、
catch
としているところがあります。何故ですか?
このふたつで、何が変わりますか?


throw ex;
としているところと、
throw;
としているところがあります。何故ですか?
このふたつで、何が変わりますか?

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