C pengendalian ralat


Bahasa C tidak menyediakan sokongan langsung untuk pengendalian ralat, tetapi sebagai bahasa pengaturcaraan sistem, ia membolehkan anda mengakses data asas dalam bentuk nilai pulangan. Apabila ralat berlaku, kebanyakan panggilan fungsi C atau UNIX mengembalikan 1 atau NULL dan menetapkan kod ralat errno, iaitu pembolehubah global yang menunjukkan ralat berlaku semasa panggilan fungsi. Anda boleh menemui pelbagai kod ralat dalam fail pengepala <error.h>

Jadi, pengaturcara C boleh menyemak nilai pulangan dan memutuskan tindakan yang sesuai untuk diambil berdasarkan nilai pulangan. Pembangun harus menetapkan errno kepada 0 semasa pemulaan program, yang merupakan amalan pengaturcaraan yang baik. Nilai 0 menunjukkan bahawa tiada ralat dalam atur cara.

errno, perror() dan strerror()

Bahasa C menyediakan fungsi perror() dan strerror() untuk Teks paparan mesej yang berkaitan dengan errno. Fungsi

  • perror() memaparkan rentetan yang anda hantarkannya, diikuti dengan titik bertindih, ruang dan perwakilan teks bagi nilai errno semasa. Fungsi

  • strerror(), mengembalikan penunjuk yang menunjuk kepada perwakilan teks bagi nilai errno semasa.

Mari kita simulasi situasi ralat dengan cuba membuka fail yang tidak wujud. Terdapat banyak cara anda boleh mengeluarkan mesej ralat, di sini kami menggunakan fungsi untuk menunjukkan penggunaan. Perkara lain yang perlu diambil perhatian ialah anda harus menggunakan strim fail stderr untuk mengeluarkan semua ralat.

#include <stdio.h>#include <errno.h>#include <string.h>extern int errno ;int main (){
   FILE * pf;   int errnum;
   pf = fopen ("unexist.txt", "rb");   if (pf == NULL)   {
      errnum = errno;
      fprintf(stderr, "错误号: %d\n", errno);
      perror("通过 perror 输出错误");
      fprintf(stderr, "打开文件错误: %s\n", strerror( errnum ));   }   else   {
      fclose (pf);   }   return 0;}

Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:

错误号: 2通过 perror 输出错误: No such file or directory打开文件错误: No such file or directory

Ralat bahagi dengan sifar

Apabila melakukan operasi bahagi, jika anda tidak menyemak Jika pembahagi adalah sifar, ralat masa jalan akan terhasil.

Untuk mengelakkan perkara ini berlaku, kod berikut akan menyemak sama ada pembahagi adalah sifar sebelum melakukan operasi bahagi:

#include <stdio.h>#include <stdlib.h>main(){   int dividend = 20;   int divisor = 0;   int quotient; 
   if( divisor == 0){
      fprintf(stderr, "除数为 0 退出运行...\n");      exit(-1);   }
   quotient = dividend / divisor;
   fprintf(stderr, "quotient 变量的值为 : %d\n", quotient );   exit(0);}

Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan Keputusan berikut :

除数为 0 退出运行...

Status keluar program

Biasanya, apabila program berjaya melaksanakan operasi dan keluar seperti biasa, ia akan mempunyai nilai EXIT_SUCCESS. Di sini, EXIT_SUCCESS ialah makro dan ia ditakrifkan sebagai 0.

Jika terdapat keadaan ralat dalam atur cara, apabila anda keluar dari program, ia akan menjadi dengan nilai status EXIT_FAILURE, yang ditakrifkan sebagai -1. Jadi, atur cara di atas boleh ditulis sebagai:

#include <stdio.h>#include <stdlib.h>main(){   int dividend = 20;   int divisor = 5;   int quotient; 
   if( divisor == 0){
      fprintf(stderr, "除数为 0 退出运行...\n");      exit(EXIT_FAILURE);   }
   quotient = dividend / divisor;
   fprintf(stderr, "quotient 变量的值为: %d\n", quotient );   exit(EXIT_SUCCESS);}

Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:

quotient 变量的值为 : 4