2009-06-04 1 views
2

に処理するためのコールバック関数を使用すると、実際に...エラー私はCのエラー処理を被った困難について考えてきたC

if(printf("hello world")==-1){exit(1);} 

を行いますが、あなたは冗長な、通常は無用をやっていないことで、共通の基準を破る者のようにコーディング。 libcの周りにラッパーがあればどうでしょうか?以下のようなので、あなたは...のように私は私自身のBSDライセンスのlibcのを合成していますこのようなラッパーを作る検討しています

//main... 
error_catchall(my_errors); 
printf("hello world"); //this will automatically call my_errors on an error of printf 
ignore=1; //this makes it so the function will return like normal and we can check error values ourself 
if(fopen.... //we want to know if the file opened or not and handle it ourself. 
} 

int my_errors(){ 
    if(ignore==0){ 
     _exit(1); //exit if we aren't handling this error by flagging ignore 
    } 
return 0; 
//this is called when there is an error anywhere in the libc 
} 
... 

を何かができる(私はすでに..アンタッチャブルに触れることがあります)、私はしたいと思います人々はそれについて何を考えているか知っている.. これは実際には実生活で動作し、-1を返すよりも有用でしょうか?

+0

printf(...)== -1をチェックすると、printf(...)は印刷される文字数を返します.0未満にすることはできません。 – Kai

+1

"印刷された文字数が返されますエラーが発生した場合は-1が返されます。 " – Earlz

+0

エラーが発生した場合は、すべてのlibc関数がerror_catchallのパラメータにラップされていますか? – LB40

答えて

1

しかし、予期したときにどのようにエラーをキャッチすることができますか?たとえば、ファイルがオープンしていて、一般的なエラーキャッチャーではなくコードで対処したいと思うかもしれません。

これを行うには、すべての機能の2つのバージョンが必要です。 1つはエラーをトラップし、もう1つはエラーを返します。

ライブラリを変更せずに、このようなことをずっと前にやったことがあります。エラーチェックを行った共通呼び出し用のラッパー関数を作成しました。だから私のerrchk_malloc呼び出しは戻り値をチェックし、割り当てが失敗した場合はエラーを発生させました。それから、私は、ビルドされたmallocの代わりに、どこでもこのバージョンを使用しました。私は模倣にいくつかの試みを見てきました。この年の間に

2

はANSI Cで/キャッチを試みる:

私はそれのtry/catchのアプローチは、よりシンプルだと思いますきみの。

+2

このようなフレームワークを使用する代わりに、単純なgotoを使用することもできます。次に例を示します。 の#define TRY/*何も*/ の#define CATCH(ラベル)ラベル: の#define THROW(ラベル)はgotoラベル TRY { FD =オープン(...); if(fd <0)THROW(open_failed); ... } return; CATCH(open_failed){ ... } これは縮尺どおりではありませんが、実際にこのようなマクロはお勧めしませんが、例外を使用するのとほぼ同じようにエラー処理にgotoを使用することが可能です後藤は、単一の機能に限定されているが、あなたは、呼び出し元の関数にそれを渡すことはできませんので。 – hlovdal

+2

あなたのコメントは、「後藤は有用であると考え、」:) – dfa

+2

はい受けることができます;)私の意見の後藤で利用されていない、と私は、多くの場合、エラー処理のためにそれを使用して開始する人々をお勧めします。 – hlovdal

0

エラーが発生したらすぐに正常に終了することを目標にしていますが、エラーリカバリを最小限に抑えるには、あなたのアプローチがどのように役立つかわかりません...

この種の問題を回避するために

、私は時々私のエラー管理を統合するLD_PRELOAD_PATHを使用します(唯一の私自身のプロジェクトのために、これは本当に良い方法ではありませんので、...)

0

あなた本当には、標準を変更しますかLIBCの行動?一般的な関数をいくつか拡張することができます。

例えば、Gnomeはg_mallocg_try_mallocを使用します。前者は失敗時に中止し、後者は単にmallocのようなヌルポインタを生成します。