9

try {}私たちが使用する C++やJava のような C では、例外とエラーをどのように処理できますcatch{}か? Cに方法はありますか?

4

2 に答える 2

8

いいえ、できませんが、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;
}
于 2013-10-02T07:44:24.657 に答える
7

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>そのファイルは、一部のオペレーティング システムで発生する可能性のあるエラーの定義に由来します。

ソース参照

于 2013-10-02T07:40:12.953 に答える