C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Exceptionのカスタムクラスについて


(過去ログ 63 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■36147 / inTopicNo.1)  Exceptionのカスタムクラスについて
  
□投稿者/ 例外 (5回)-(2009/05/22(Fri) 10:19:15)

分類:[VB.NET/VB2005 以降] 

お世話になっております。

現在、HogeExceptionというカスタムクラスを作成しております。
HogeExceptionは、System.Exceptionクラスから派生しているのですが、
StackTraceが途切れてしまうのを避けるための方法が分からないでおります。

HogeExceptionクラス-----------
Public Class HogeException
    Inherits Exception
         〜
------------------------------

Throwさせる箇所---------------

Try
    Dim a As Integer = 0
    a /= 0
Catch ex As Exception
    Throw New HogeException("hogehoge")   ←ココのThrowのさせ方
End Try
------------------------------

上記では、当然のごとくStackTraceがココから発生してしまうことになります。
そこで、このStackTraceが途切れないようThrowさせる方法をご教示頂たく思います。

よろしくお願いします。

引用返信 編集キー/
■36149 / inTopicNo.2)  Re[1]: Exceptionのカスタムクラスについて
□投稿者/ Hongliang (387回)-(2009/05/22(Fri) 10:47:33)
HogeException のコンストラクタで Exception も受け取れるオーバーロードを用意し、MyBase のコンストラクタに渡してあげてください。Exception コンストラクタのヘルプの解説に Exception の派生クラスを実装する例が挙げられているのでそれをご参考に。
で、再スローするときに Catch で受け取った Exception を HogeException に渡してやれば、その Exception を HogeException の InnerException として取得できます。
引用返信 編集キー/
■36150 / inTopicNo.3)  Re[2]: Exceptionのカスタムクラスについて
□投稿者/ 例外 (6回)-(2009/05/22(Fri) 11:09:02)
ご返事ありがとうございます。

No36149 (Hongliang さん) に返信
> HogeException のコンストラクタで Exception も受け取れるオーバーロードを用意し、MyBase のコンストラクタに渡してあげてください。Exception コンストラクタのヘルプの解説に Exception の派生クラスを実装する例が挙げられているのでそれをご参考に。
> で、再スローするときに Catch で受け取った Exception を HogeException に渡してやれば、その Exception を HogeException の InnerException として取得できます。

以下のようにすれば解決できました!

HogeExceptionクラス-----------
Public Class HogeException
Inherits Exception

Sub New()
End Sub

Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub

Sub New(ByVal Message As String, ByVal Inner As Exception)
MyBase.New(Message, Inner)
End Sub


------------------------------

Throwさせる箇所---------------
Try
Dim a As Integer = 0
a /= 0
Catch ex As Exception
Throw New HogeException("hogehoge", ex) ←変更
End Try
------------------------------

これでStackTraceが途切れないようになりました。
ありがとうございました。
疑問なのですが、このStackTraceにはフレームワーク側のTraceが入っていないように見えるのですが、
ユーザ定義のExceptionだからということになるのでしょうか?

引用返信 編集キー/
■36155 / inTopicNo.4)  Re[3]: Exceptionのカスタムクラスについて
□投稿者/ ぱぱいやん (26回)-(2009/05/22(Fri) 12:00:01)
ぱぱいやん さんの Web サイト
2009/05/22(Fri) 12:01:32 編集(投稿者)

No36150 (例外 さん) に返信

C#で試してみたのですが、コンパイラが通りませんでした。
VB だと通るのでしょうか?

> 疑問なのですが、このStackTraceにはフレームワーク側のTraceが入っていないように見えるのですが、
> ユーザ定義のExceptionだからということになるのでしょうか?

以下のコードで試してみました。

class Program
{
  static void Main(string[] args)
  {
    try {
      int a = 0;
      a = a / a;
    }
    catch(Exception ex) {
      throw new HogeException(ex.Message, ex);
    }
  }
}

public class HogeException : Exception
{
  public HogeException() {}
  public HogeException(string message) : base(message) {}
  public HogeException(string message, Exception inner) {}
}

で、こうなりました。

場所 ConsoleApplication2.Program.Main(String[] args) 場所 XXXXXXXXXXX\ConsoleApplication2\ConsoleApplication2\Program.cs:行 18
場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()

これは、例外氏のいうフレームワーク側の情報とは違いますか?
引用返信 編集キー/
■36158 / inTopicNo.5)  Re[4]: Exceptionのカスタムクラスについて
□投稿者/ 例外 (7回)-(2009/05/22(Fri) 12:20:37)
No36155 (ぱぱいやん さん) に返信
> 2009/05/22(Fri) 12:01:32 編集(投稿者)
> C#で試してみたのですが、コンパイラが通りませんでした。
> VB だと通るのでしょうか?
はい。通ります。

> 場所 ConsoleApplication2.Program.Main(String[] args) 場所 XXXXXXXXXXX\ConsoleApplication2\ConsoleApplication2\Program.cs:行 18
> 場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
> 場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
> 場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
> 場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
> 場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
> 場所 System.Threading.ThreadHelper.ThreadStart()
>
> これは、例外氏のいうフレームワーク側の情報とは違いますか?

すいません。早とちりをしてしまいました。
InnerExceptionのStackTraceを見るのを忘れてました。

お手数お掛けいたしました。ありがとうございました。
解決済み
引用返信 編集キー/
■36162 / inTopicNo.6)  Re[5]: Exceptionのカスタムクラスについて
□投稿者/ ぱぱいやん (28回)-(2009/05/22(Fri) 13:21:08)
ぱぱいやん さんの Web サイト
2009/05/22(Fri) 13:21:36 編集(投稿者)
No36158 (例外 さん) に返信

> ■No36155 (ぱぱいやん さん) に返信
>>2009/05/22(Fri) 12:01:32 編集(投稿者)
>>C#で試してみたのですが、コンパイラが通りませんでした。
>>VB だと通るのでしょうか?
> はい。通ります。

C# だと「ゼロ除算だめー」みたいなコンパイルエラーになるんですよね。
この辺の挙動って VB と違うんですね。
おもしろいなぁ。

#って本題と違う話題で申し訳ないです

あっ・・・2008でも同じ結果だ。
解決済み
引用返信 編集キー/
■36164 / inTopicNo.7)  Re[6]: Exceptionのカスタムクラスについて
□投稿者/ 例外 (8回)-(2009/05/22(Fri) 14:21:48)
No36162 (ぱぱいやん さん) に返信
> 2009/05/22(Fri) 13:21:36 編集(投稿者)
> ■No36158 (例外 さん) に返信
>
>>■No36155 (ぱぱいやん さん) に返信
> >>2009/05/22(Fri) 12:01:32 編集(投稿者)
> >>C#で試してみたのですが、コンパイラが通りませんでした。
> >>VB だと通るのでしょうか?
>>はい。通ります。
>
> C# だと「ゼロ除算だめー」みたいなコンパイルエラーになるんですよね。
> この辺の挙動って VB と違うんですね。
> おもしろいなぁ。
>
> #って本題と違う話題で申し訳ないです
>
> あっ・・・2008でも同じ結果だ。

はっ!本当ですね。C#ですると、
a /= 0; ←これが「定数 0 で除算します。」って言われます。

C#ではこういったものを書いたことなかったので、気づきませんでした。
VBでは、こう(a++;)書けないくて、こう(a+=1)書いてたので、
その名残りで、a /= 0 な書き方をしてしまってました。

ちなみに、どちらの挙動もVS2005で行いました。

おもしろいですね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -