tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: Exceptionがcatchできない
投稿日: 2009/12/05(Sat) 10:15
投稿者Hongliang
> 扱っているjpeg画像にはサムネールが含まれないケースが少ないので、その場合だけ例外に
> した方が更に速度向上になると思い
つまり PropertyIdList に &H501B が含まれているかどうかの事前チェックをせずに
直接取りに行くってことですね?

> いずれもArgumentExceptionをcatchできません。何故?
catch できないっていうのはどういう状態になるのでしょう?
呼び出し元に ArgumentException が伝播している?
そもそもスローされていないようにみえる?
これを呼び出したときどういう動作を示しますか?
例外が出るなら、そのスタックトレースはどうなっていますか?
サムネイルを持っている(&H501B の PropertyItem がある)画像ファイルの場合はどうなりますか?
逆に持っていない画像の場合は?

以下、ソースを眺めて気になった部分を指摘しておきます。

> Private Function GetThumbnail_1(ByVal path As String) As Image

> fs.Close()
FileStream に Using を使っているのですからこれは不要です。

> Dim imageBytes As Byte() = p.Value
> Using stream As New IO.MemoryStream(imageBytes.Length)
>     stream.Write(imageBytes, 0, imageBytes.Length)
>     Return Image.FromStream(stream)
> End Using
MemoryStream はコンストラクタの引数に Byte 配列を受け取ることができます。
http://msdn.microsoft.com/ja-jp/library/e55f3s5k.aspx
これを使えば imageBytes や Write メソッドの呼び出しは不要です。渡した Byte() で初期化済みになるので。
また、画像のソースとなる Stream は、画像を使わなくなるまで Close すべきではありません。
特に MemoryStream は Close するメリットは無いと言っていいでしょう。


> Private Function GetThumbnail_2(ByVal path As String) As Image

> Using fs As IO.FileStream = IO.File.OpenRead(path)
>         Finally
>             fs.Close()
>         End Try
> End Using
Using はこの Finally 節を自動的に実装してくれる機能です(Nothing チェックとかも入りますが)。
わざわざ自分で Finally 節を書くなら Using の意味がありません。
この Finally 節は不要です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。