タイトル : 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 節は不要です。 |