try {}
私たちが使用する C++やJava のような C では、例外とエラーをどのように処理できますcatch{}
か? Cに方法はありますか?
2 に答える
いいえ、できませんが、gotoを使用するパターンがいくつかあります(Goto は必ずしも悪ではありません)。
このサイトからの例
int foo(int bar)
{
int return_value = 0;
allocate_resources_1();
if (!do_something(bar))
goto error_1;
allocate_resources_2();
if (!init_stuff(bar))
goto error_2;
allocate_resources_3();
if (!prepare_stuff(bar))
goto error_3;
return_value = do_the_thing(bar);
error_3:
cleanup_3();
error_2:
cleanup_2();
error_1:
cleanup_1();
return return_value;
}
Cに方法はありますか?
C では例外処理を行いません。
私が言う回避策として、このC言語の例外処理がありました。
通常、C (古い言語と同様) は、返されるエラー コード、可能な errno の設定、および errno を説明する文字列のテーブル (
sys_errlist
) を使用して、このような状況を管理します。したがって、C での典型的なエラー管理では、エラーを返す可能性のある関数 (ほとんどすべての標準的な libc 関数) でエラーをテストし、エラーが発生した場合は何らかの方法でそれを管理する必要があります。
setjmp()
とlongjmp()
関数この記事では、例外的な _C_ase で何をすべきか、またはできるかについて説明します。C 言語には、例外処理のサポートとランタイムがありません。C++ の .. のようなものは存在し
try
ません。catch
例外クラスの定義と階層は存在しません 。setjmp()
longjmp()
#include <setjmp.h> #include <stdio.h> int foo(int p) { if (p) siglongjmp(env,p); /* return to sigstejmp returning p */ return 0; } static sigjmp_buf env; int main() { int a,r; if (!(r=sigsetjmp(env, 1))) { for (a=0; a<10; a++) { fprintf(stdout,"%d\n",foo(a)); fflush(stdout); } } else { fprintf(stdout,"exceptionally returned %d",r); fflush(stdout); } }
sigsetjmp と siglongjmp は、posix に準拠し、bsd 標準と互換性のあるバリアントです (GNU Libc のドキュメントを参照)。
...はい、C++ の try{..}catch(..) のように見えますが、catch 引数が欠落していることと、例外レベルが 1 つしかないことを除いて
C でのエラー処理:
C は、エラー処理 (例外処理とも呼ばれます) を直接サポートしていません。慣例により、プログラマーは最初からエラーの発生を防ぎ、関数からの戻り値をテストすることが期待されています。
「errno」と呼ばれる外部変数があり、インクルード後にプログラムからアクセスできます。
<errno.h>
そのファイルは、一部のオペレーティング システムで発生する可能性のあるエラーの定義に由来します。