FC2ブログ

FileStreamの例外処理

人生何度目なのか数えきれないが、やらかした。

始めは次のコード
Private void func(String path, byte [] barr)
{
FileStream fs = null;
BinaryWriter bw = null;
try
{
fs = new FileStream(path, FileMode.Create, FileAccess.Write);
bw = new BinaryWriter(fs);
bw.Write(barr);
bw.Flush();
}
catch (IOException) {}
finally
{
if (bw != null) { bw.Close(); }
if (fs != null) { fs.Close(); }
}
}

こいつの意図は、Write/FlushでIOExceptionが発生したとしてもfinallyでちゃんとCloseしよう、ってことなんだけれども。
finallyのFileStream.Close()で発生する例外はObjectDisposedExceptionくらいのもんだろうってことで気にせず。

とここで、pathにUNCを指定して共有側のLANケーブルを抜いてみると、妙なタイミングでハンドルしていない例外発生。
どうもFileStreamのFinalizeでFlush処理をしていてIOException発生ということらしく。
fsがガーベッジコレクションで処理されるタイミングでDisposeが動いたため、風だ。
なので明示的にDisposeしないとだめだろう、ってことでClose()の後にDispose()追加。でIOExceptionが出るのでここでもtry-catchと・・・
Private void func(String path, byte [] barr)
{
FileStream fs = null;
BinaryWriter bw = null;
try
{
fs = new FileStream(path, FileMode.Create, FileAccess.Write);
bw = new BinaryWriter(fs);
bw.Write(barr);
bw.Flush();
}
catch (IOException) {}
finally
{
try
{
if (bw != null) { bw.Close(); bw.Dispose(); }
if (fs != null) { fs.Close(); fs.Dispose(); }
}
catch (IOException) {}
}
}

ありゃぁ、なんともマヌケなコードになっちまった。
try~catchで細々やらなくてもusing使えば問題ないのかどうかは未検証。
usingはあんまり使ったことがないんだけど、
using (FileStream fs = new FileStream(path, FileMode.Create))
{
...
}

ってやればすっきりしそうな気がするが、Disposeまで面倒みてくれるかなぁ・・・今度やってみよ。
スポンサーサイト

Dns.GetHostEntry

TCPクライアントの作成で、お決まりのコーディング。
IPHostEntry host = Dns.GetHostEntry(hostname);
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
//IPv4ソケット構築
break;
}
}

で、Win7では普通に動くのだが、WinXPだと、『データベースには存在するが情報が取得できない』と例外が吐かれる。
なので、
IPAddress [] ipa = Dns.GetHostAddresses(hostname);
foreach (var ip in ipa)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
//IPv4ソケット構築
break;
}
}

として解決。
うーむ、Windowsってやつぁまったく。

Guilty

おぉ、ちょっと綺麗なのが上がってた。
9/5にはソロ版シングルもでるようだし。



KARA Collection(2012/09/05)からかな?日本語版。

[MV] Seungyeon (KARA) - Guilty JP Ver. 投稿者 mrhoneyhammie
プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク