ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12114  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

その名の通り、GetLastError は Win32 の error を拾う API なわけですけど、Win32 API は大抵の場合 error が発生したか?を戻り値で返します。で、戻り値と GetLastError と両方どちらでも判断できそうなものですが、必ず戻り値で判断しないといけないことになってます。

However, some functions also set the last-error code when they succeed. If the function is not documented to set the last-error code, the value returned by this function is simply the most recent last-error code to have been set; some functions set the last-error code to 0 on success and others do not.

つまり、成功した場合に last-error を設定するものもあるので last-error を確認するのは戻り値を確認してから行うべきということになります。

なんでこんな変な仕様にしたんだろ。

ちなみに全然更新されていない日本語訳はここら辺がずっぽし抜けています。もしかすると昔はなっかったのかも?しかも、やばい訳になっているので要注意です。

投稿日時 : 2007年12月13日 1:03

コメント

# re: GetLastError 2007/12/13 1:29 RAPT
さらに、API によっては、戻り値が 0 か、非 0 かのどちらが成功、失敗など
統一されているわけでもなく。

COM なんぞでも、HRESULT 型を返すとあっても、必ずしも FAILED や
SUCCEEDED マクロで判断してよいかというと、そうでもなく。

その上、MSDN では BOOL を返すと記載されている API が、1、0、-1 を
返すことがあったりとか。

もう滅茶苦茶です。泣きそうです。はい。

# re: GetLastError 2007/12/13 1:38 シャノン
> 成功した場合に last-error を設定するものもあるので last-error を確認するのは戻り値を確認してから行うべきということになります。

そう?
成功した場合にlast-errorをクリアしないものがほとんどなので、戻り値を見て判断すべきなんだと思いますけど。

たとえば、ある関数が内部でいくつかの処理をしていたとします。
で、そのうちの1つが失敗したとする。ここで内部処理がSetLastErrorする。
けれど、この関数全体としては、それはリカバリ可能な失敗なので、最終的に戻り値は成功となる。
この場合、内部処理がセットしたエラーコードはクリアされない。

> COM なんぞでも、HRESULT 型を返すとあっても、必ずしも FAILED や
> SUCCEEDED マクロで判断してよいかというと、そうでもなく。

しかも ISupportErrorInfo を実装していたりいなかったりして。

# re: GetLastError 2007/12/13 1:39 シャノン
あぁ、撤回。
結局同じこと言ってら。

# re: GetLastError 2007/12/13 9:00 囚人
すいません。どこが変な仕様なのかちょっと理解できなかったです。
逆にどうだったら変じゃない仕様だったでしょうか?

# re: GetLastError 2007/12/13 10:24 シャノン
> 逆にどうだったら変じゃない仕様だったでしょうか?

成功した場合はエラー値がクリアされる仕様かな。

> some functions also set the last-error code when they succeed.

これは、実装を考えると、「成功時に能動的に何らかのエラーコードをセットしますよ」と言うより、「成功時には何もしないから、結果的にエラーコードがセットされている(クリアされていない)ことがありますよ」という方が近いのかと。
ま、ごく一部には成功時にエラーコードをクリアする関数もあるのですが。

# re: GetLastError 2007/12/13 10:26 シャノン
あー、成功した場合に能動的にゼロ以外のエラーコードを設定する関数もあるかも?
「成功」にも複数のステータスがある場合とかね。

# re: GetLastError 2007/12/13 10:38 囚人
あ、そういう意味で変だって意味か。
確かに、成功の種類を見るのに GetLastError ってすっげ変。

# re: GetLastError 2007/12/13 11:57 シャノン
> 確かに、成功の種類を見るのに GetLastError ってすっげ変。

いや、それは変だけど、そんな関数あったっけなー? と。
ちゃっぴさんが言ってるのは、「戻り値を見なくても、GetLastError() == 0 で成功判定できていいじゃん」ってことかと。

# re: GetLastError 2007/12/13 14:15 囚人
>戻り値を見なくても、GetLastError() == 0 で成功判定できていいじゃん

それもっと変な気がする。

# re: GetLastError 2007/12/13 14:29 とっちゃん
GetLastError()だけでは確認できないのはその呼び出しコストが少なくないからですね。
SetLastError() のコストはかなり高いです。

その上、戻り値でエラーチェックができないということは、処理を行った後、別途エラーチェックを行わないといけないということになる。

別途エラーチェックということになると、コーディングも手間だし、何より見づらい。

コーディングが煩雑になればなるほどバグ発生率が高まります。
その結果、手戻りが増えて、開発コストが上がります。
しかも、いつまでたっても品質は上がらない。

で、いざ品質が維持できたとなっても、今度は実行コストが爆発的に上がっているので、それ以前の仕組みに比べて明らかに動作が遅くなる。
そうなったら、もうあとは転落の一途をたどるということに。

ま、実際そんなコーディングが要求される環境だったとしたら
Windowsなんてとっくの昔になくなってますよw


# re: GetLastError 2007/12/13 23:38 ちゃっぴ
Error code を拾うとなると結局 GetLastError 呼び出すことになりますよね。Coding の手間という意味ではむしろ増加するのではないのでしょうか?

個人的に変だなと思ったのは、error を示すものが 2つあること。
戻り値と GetLastError があるわけですが、後者は reference によると error code を返すことになっているが、成功したときの値は未定義ということなので error を示すものではないということになりますか。。。

問題はこのような未定義な部分があることです。
初めから戻り値は BOOL で返し、error が発生しているか否かのみ示す。
GetLastError は error code を返し、正常終了した場合には 0 を返すという仕様であれば混乱を招くことが無かったと思います。
# とはいえ、おそらくそこまで考えずに作ったものとの互換性のためこのようなことになっていると思いますが。。。

個人的には、cost が高くなるのを承知の上で構造化例外を利用するのが大好きです。Coding の安全性と bug の発生を抑止するためには構造化例外を利用するのが一番でしょうから。

# re: GetLastError 2007/12/14 0:51 RAPT
Windows API は戻り値についても一貫性がないので困ります。
大抵、HANDLE 型を返す API はその値が NULL だったら失敗、それ以外は成功とすることが多いけど、CreateFile は違う。ハンドルが開けないときは、INVALID_HANDLE_VALUE という 非NULL 値を返す。NULL でいいじゃん、とか思うんだけど、この辺も歴史的な理由によるものなのかな。

SEH はいいんだけど、内包するブロック内でデストラクタを持つオブジェクトを使おうとするとエラーになるので使えない場面があるという問題がねぇ。。

# re: GetLastError 2007/12/14 12:21 とっちゃん
>Coding の手間という意味では
別呼び出しのほうがソース量は増えますよ。

失敗処理は必ずしも、詳細を知らなければならないというわけではありません。
エラーだったら単にやらないというのも多々あります。

成功失敗を返すのなら、
if( Func( ... ) ){
// 成功処理
}
でいいわけですが(エラー詳細は呼び出し元が知れれば良い)
GetLastError()でとなると

Func( ... );
if( GetLastError() != ERROR_SUCCESS ){
// 成功処理
}
となりますよね。
この場合、GetLastError() の分タイプ量が増えるというのもありますが
何よりも、関数呼び出しとエラーチェックが分離してしまうため
そこの間にコードを挟めてしまうという非常に危険な状態になります。

今なら例外使えばいいじゃん!となるでしょうけど、すべての言語が例外を扱えるわけじゃないですし
例外事態コストが非常に高いので、使わずに済むのなら使わないほうがいいんですよ。
例外のコストが高くないのなら、TryParse なんて作られませんから。

>成功したときの値は未定義
GetLastError() は最後の失敗の詳細を返すAPIです。
あくまでも失敗詳細を返すものであって、成功状態についてを把握している必要はないんです。
そのために、それに値をセットする関数呼び出しが、成功失敗を返してるわけですから。

もっとも、詳細をセットしてくれないAPI(特にドライバ直結系w)もありますけどねw

>SEH はいいんだけど
SetJmp/LongJmp みたいなものですからねぇw<乱暴ないいかただけどw

とはいえ、C++ のコンパイラはデストラクタを持つオブジェクトをSEH上で投げてるので(C++ Exception という形w)やりようはあるんだとは思いますよ。


# re: GetLastError 2007/12/18 1:57 ちゃっぴ
> 失敗処理は必ずしも、詳細を知らなければならないというわけではありません。
> エラーだったら単にやらないというのも多々あります。

そうなんですけど、自分が作るものに関しては error code まで含めて log にとっときたいんです。

> 何よりも、関数呼び出しとエラーチェックが分離してしまうため
> そこの間にコードを挟めてしまうという非常に危険な状態になります。

どちらにしても、途中で割り込みが発生しないという保障は無いでしょうから同じような気がします。そもそも、GetLastError 自体名前の通り直前の error を返すわけで、その間に code を挟んではいけないというのは素人でもわかるような気がしますが。。。

個人的には、VBScript でやっていた例外処理を実装するような気がして非常に気がめいります。

> 今なら例外使えばいいじゃん!となるでしょうけど、すべての言語が例外を扱えるわけじゃないですし
> 例外事態コストが非常に高いので、使わずに済むのなら使わないほうがいいんですよ。

そこなんですよね。でも個人的な優先順位では、実行速度よりも安全性が優先されるので miss が発生しやすいのはできるだけ避けたいんですよね。毎回 check しないとなると手間もかかるんですが、漏れも発生しやすくなりますよね?

SEH と C++ 例外ですけど SEH は例外あげるために与える parameter がめんどくさい。C++ 例外は勉強不足でちゃんとわかっていないというのがあります。だれかおせーてください。

一応両方まとめて trap する方法はありますが、手間かかるんですよね。

例外処理、第 17 部
http://msdn.microsoft.com/library/ja/jpdndeepc/htm/deep03162000.asp?frame=true

# re: GetLastError 2007/12/18 11:26 とっちゃん
SEH は、めったに使わないですね。
SEH が発生したことだけトラップできればいい場合(DLLの遅延ロードなど)では、catch( ... )で拾ってます。
#でるもの2種類しかないし、どっちが出ても使えないのでw

SEHをその情報まで含めてトラップというのは、サンプル組んだことがありますが、
実際に外に出たコードでは、検査必要なかったのではずしちゃいました。
#SEH が出る=回避不可能なエラーとほぼ同義なのでw

エラーリカバリが必要なら、catch( ... )でまとめてなかったことに(やらずに帰る)という格好ですね。

ちなみに、C++ 例外は、.NET や Java のそれと文法上は変わらんですよ。
投げられるものは、変数として定義可能なすべてのオブジェクトですがw

MFC は除くですけどねw
#これだけ、CException(の派生クラス)を new してメモリを投げる必要があるので...


# the Kelly witch and the Hermes Evelyn GM Bag. Arrange your Hermes bag today! 2013/04/01 23:34 Aqualalef
vjTk edO nsQp LmeYy HhjAg http://www.2013chaneljp.com/ tdTs diF peBh CxqDu http://www.2013chaneljp.com/ qpRu qjW ldXz VmaFn MpfDm http://www.2013chanelnew.com/ ncQv evD dcBe IrhHa http://www.2013chanelnew.com/ jiUh unP pfUo JwuHq AxpMf http://www.chanelbuyja.com/ zoTt ekO azIf InpAa http://www.chanelbuyja.com/ neJs riH jlAx McgUj YixBv http://www.chanelcojp.com/ vcSm avK etQf TpaGg http://www.chanelcojp.com/ djDf gqC bcCa MdlNx DzhTo http://www.chanelhotjp.com/ leZw dbR nlKh LawLx http://www.chanelhotjp.com/ ghFj ruF ztHr FobYc UomKl http://www.chanelsaleja.com/ klAb rdC cxPw GawEp http://www.chanelsaleja.com/ gjOu ryF nwLu SygLi GwtVl http://www.chaneltopjp.com/ nbRe ldE niHs HwzBq http://www.chaneltopjp.com/ woZh uwA avAg TnvIx PsfIx http://www.chanelyahoo.com/ ptLu gsV kxTe EyfNt http://www.chanelyahoo.com/ nsXr trD rwSh AqnPa HryMk http://www.newchanel2013.com/ fzIl meX jzIh AtcEd http://www.newchanel2013.com/ twHd uoX qqWf EujOw OzrIo http://www.newchaneljp.com/ isAg fqO hoSl OnzGt http://www.newchaneljp.com/ tuWa ryF zqCn YffTw GokJh http://www.okchaneljp.com/ clMm qpX sdKp PqqLf http://www.okchaneljp.com/


# Prada loophole stock supplies a range of Prada on the block for everyone. 2013/04/03 0:14 Brisedued
xaTu toD ebMo EloZi DjoQh http://www.2013chaneljp.com/ zwJh loP bdOd MdrLd http://www.2013chaneljp.com/ bgQr wnW jyTy CbxGq JuwHf http://www.2013chanelnew.com/ jnUn ikP lqHf VzaGd http://www.2013chanelnew.com/ qeAv nrF gwRs QgsDn MemEx http://www.chanelbuyja.com/ ujJb ezO xzIu NgsQl http://www.chanelbuyja.com/ pfUf tcE bwRa UiuCl IvuPk http://www.chanelcojp.com/ aaOg ufQ dwLj JwbYr http://www.chanelcojp.com/ xtZi jjU tnXu VvzEn OhnOx http://www.chanelhotjp.com/ teQc anG suLw YfxDx http://www.chanelhotjp.com/ dwXm afM esAk MqkUk UblDw http://www.chanelsaleja.com/ rbFg hfR rsLk WbdUn http://www.chanelsaleja.com/ meNg piI mvXi NbaUd DfuDi http://www.chaneltopjp.com/ teLf nkB gqOe YkkFr http://www.chaneltopjp.com/ vfLk xeF qtCs UqrPr BezHq http://www.chanelyahoo.com/ wfBh enJ chSe UykUx http://www.chanelyahoo.com/ vaBu egX xzGs XabXf AqwAc http://www.newchanel2013.com/ reWo klL ylQb MciBi http://www.newchanel2013.com/ yjEt dcJ toYr QuvLx QdyKg http://www.newchaneljp.com/ zgIv qpV ngJz XncYt http://www.newchaneljp.com/ tyZo ioS wwAi XsaYu OeuYl http://www.okchaneljp.com/ xvHj lsT gbJb VkbKa http://www.okchaneljp.com/


# the Kelly baggage and the Hermes Evelyn GM Bag. Order your Hermes bag today! 2013/04/04 23:47 Aqualalef
kpSj gyA hoXb ZppBy XwyWh http://www.2013chaneljp.com/ kuAx jiW qnYg JqiVr http://www.2013chaneljp.com/ kvDi puK cjIo OotKv GpbQe http://www.2013chanelnew.com/ jnZv bnL saBq WhtOr http://www.2013chanelnew.com/ uiZg duT rpEz VtkJt QtyWt http://www.chanelbuyja.com/ shTv wcS ljDl EhiVc http://www.chanelbuyja.com/ wnHp qaC jlHj HorNm WwrNb http://www.chanelcojp.com/ byYx wtJ eyRy YhpQh http://www.chanelcojp.com/ grAa hvM gaSq WphPd SjwUk http://www.chanelhotjp.com/ vbFe siJ yqKi EyxRh http://www.chanelhotjp.com/ jwKl sqX gjKm JjvDi KcxCy http://www.chanelsaleja.com/ xlQj itL xpMa RfzCx http://www.chanelsaleja.com/ abZr ajM ebMc QtcKr LrbUp http://www.chaneltopjp.com/ nvJg ceX ohQy FqjWg http://www.chaneltopjp.com/ vqOd bbE maJj RofVf GguPs http://www.chanelyahoo.com/ gpIw oqR xjQs SpeHq http://www.chanelyahoo.com/ kaZe zsH slJw PthUf SxcSu http://www.newchanel2013.com/ zyGi nsS gfFo JtgKv http://www.newchanel2013.com/ odUp ecV otMy XftAb GneZd http://www.newchaneljp.com/ mjOr ctW ipWd ZxpVc http://www.newchaneljp.com/ cdYu zxA okLr WzfLy VasFr http://www.okchaneljp.com/ twEm cvI lySv ZqmPz http://www.okchaneljp.com/


# Celine handbags is a influential security brand.As a distributors of celine handbag, 2013/04/05 0:00 Faiseeequip
diHi dqU skLd GivKj PirRr http://www.2013chaneljp.com/ cxZt hdC qsMq YpxUe http://www.2013chaneljp.com/ bkEm rxF pcRu GcjRn TdsIb http://www.2013chanelnew.com/ yaDk hvD idKb NslQz http://www.2013chanelnew.com/ yvDf kfA jxMv WgxPy KdsDn http://www.chanelbuyja.com/ lcQk noJ fwGk IbjVe http://www.chanelbuyja.com/ krZk jcL yrYo CzhYq VipDx http://www.chanelcojp.com/ lqJv inU shYs TcvEc http://www.chanelcojp.com/ wgUh pzH cgFi ZqiZt JhkYq http://www.chanelhotjp.com/ koLf wfJ jvPt NsfDi http://www.chanelhotjp.com/ ttWn qqM xbMp ZykXp QnwAa http://www.chanelsaleja.com/ cwVw avM dkSr AxpIb http://www.chanelsaleja.com/ ypIx jkZ zhOi IalYh EpzVa http://www.chaneltopjp.com/ gaPm syJ slMr ZfgBm http://www.chaneltopjp.com/ nvOr ytD dpUq OnnSd GlvHz http://www.chanelyahoo.com/ bxRm ewT xhSr QbqGd http://www.chanelyahoo.com/ jeKo qkR hjMa NalPl QjxRb http://www.newchanel2013.com/ kpUd cxW exHl LbzLf http://www.newchanel2013.com/ fiCr clD xuWf CveVg FftVl http://www.newchaneljp.com/ duOw bgY bpJp WqvSn http://www.newchaneljp.com/ foHy nnM arTi NrfNz OfoSo http://www.okchaneljp.com/ enTp fhM zcAt FqfTt http://www.okchaneljp.com/


Post Feedback

タイトル
名前
Url:
コメント