C ++

Pengendalian Pengecualian dalam C ++

Pengendalian Pengecualian dalam C ++
Terdapat tiga jenis kesalahan perisian yang ada. Ini adalah Kesalahan Sintaks, Kesalahan Logik, dan Kesalahan Masa Jalan.

Kesalahan Sintaksis

Ungkapan, pernyataan, atau pembinaan yang salah taip adalah ralat sintaks.

Pertimbangkan dua pernyataan berikut:

int arr [] = 1, 2, 3; //betul
int arr = 1, 2, 3; // ralat sintaks, tiada []

Mereka adalah definisi bagi susunan yang sama. Yang pertama betul. Yang kedua tiada [], dan itu adalah kesalahan sintaks. Program dengan ralat sintaks tidak berjaya disusun. Penyusunan gagal dengan mesej ralat yang menunjukkan kesalahan sintaks. Perkara yang baik adalah bahawa kesalahan sintaks selalu dapat diperbaiki jika pengaturcara mengetahui apa yang sedang dilakukannya.

Ralat Logik

Kesalahan logik adalah kesalahan yang dilakukan oleh pengaturcara ketika beberapa pengkodan logik yang salah dibuat. Ini mungkin disebabkan oleh ketidakpedulian dari pengaturcara terhadap ciri bahasa pengaturcaraan atau salah faham mengenai apa yang harus dilakukan oleh program.

Dalam keadaan ini, program berjaya disusun. Program ini berjalan dengan baik, tetapi menghasilkan hasil yang salah. Kesalahan seperti itu mungkin berlaku kerana membuat gelung berulang kali 5 kali apabila dibuat berulang kali 10 kali. Mungkin juga bahawa gelung dibuat secara tidak sedar untuk mengulangi tanpa batas. Satu-satunya cara untuk menyelesaikan kesalahan seperti ini adalah dengan melakukan pengaturcaraan yang teliti dan menguji program dengan teliti sebelum menyerahkannya kepada pelanggan.

Kesalahan Masa Jalan

Input yang salah atau luar biasa menyebabkan ralat runtime. Dalam kes ini, program ini berjaya disusun dan berfungsi dengan baik dalam banyak keadaan. Dalam situasi tertentu, program terhenti (dan berhenti).

Bayangkan bahawa dalam segmen kod program, 8 mesti dibahagi dengan sebilangan penyebut. Oleh itu, jika pengangka 8 dibahagi dengan penyebut 4, jawapannya (2) adalah 2. Walau bagaimanapun, jika pengguna memasukkan 0 sebagai penyebutnya, program akan terhenti. Pembahagian dengan 0 tidak dibenarkan dalam Matematik, dan juga tidak dibenarkan dalam pengkomputeran. Pembahagian demi sifar harus dihalang dalam pengaturcaraan. Pengendalian pengecualian menangani ralat runtime, seperti pembahagian demi sifar. Program berikut menunjukkan cara menangani masalah pembahagian demi sifar tanpa menggunakan ciri pengecualian dalam C ++:

#sertakan
menggunakan ruang nama std;
int utama ()

pengangka int = 8;
penyebut int = 2;
sekiranya (penyebut != 0)

hasil int = pengangka / penyebut;
cout << result << '\n';

yang lain

cout << "Division by zero is not permitted!" << '\n';

pulangan 0;

Keluarannya adalah 4. Sekiranya penyebutnya adalah 0, outputnya adalah:

"Pembahagian dengan sifar tidak dibenarkan!"

Kod utama di sini adalah konstruk if-else. Sekiranya penyebutnya tidak 0, pembahagian akan berlaku; jika 0, pembahagian tidak akan berlaku. Mesej ralat akan dikirimkan kepada pengguna, dan program terus berjalan tanpa mogok. Kesalahan masa jalan biasanya ditangani dengan mengelakkan pelaksanaan segmen kod dan mengirim mesej kesalahan kepada pengguna.

Ciri pengecualian dalam C ++ menggunakan blok percubaan untuk if-block dan catch-block untuk blok lain untuk menangani ralat, seperti berikut:

#sertakan
menggunakan ruang nama std;
int utama ()

pengangka int = 8;
penyebut int = 2;
cuba

sekiranya (penyebut != 0)

hasil int = pengangka / penyebut;
cout << result << '\n';

yang lain

baling 0;


tangkapan (int err)

jika (err == 0)
cout << "Division by zero is not permitted!" << '\n';

pulangan 0;

Perhatikan bahawa tajuk cuba tidak mempunyai argumen. Perhatikan juga bahawa catch-block, seperti definisi fungsi, mempunyai parameter. Jenis parameter mestilah sama dengan operan (argumen) ungkapan lemparan. Ekspresi lemparan berada dalam blok percubaan. Ini melontarkan argumen mengenai pilihan pengaturcara yang berkaitan dengan kesalahan, dan blok-blok menangkapnya. Dengan cara itu, kod dalam blok percubaan tidak dijalankan. Kemudian, catch-block memaparkan mesej ralat.

Artikel ini menerangkan pengecualian pengendalian di C++. Pengetahuan asas dalam C ++ adalah prasyarat bagi pembaca untuk memahami artikel ini.

Kandungan Artikel:

  • Fungsi Melemparkan Pengecualian
  • Lebih daripada Satu Catch-Blocks untuk One Try-block
  • Cubaan bersarang / tangkap Blok
  • noexcept-specifier
  • Fungsi Std :: terminate () Khas
  • Kesimpulannya

Fungsi Melontarkan Pengecualian:

Fungsi juga boleh memberikan pengecualian seperti apa yang dilakukan oleh blok percubaan. Lontaran berlaku mengikut definisi fungsi. Program berikut menggambarkan ini:

#sertakan
menggunakan ruang nama std;
batal fn (const char * str)

jika (lebih rendah (str [0]))
baling 'l';

int utama ()

cuba

fn ("smith");

tangkapan (char ch)

jika (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';

pulangan 0;

Perhatikan bahawa kali ini, blok percubaan hanya mempunyai fungsi panggilan. Ini adalah fungsi yang dipanggil yang mempunyai operasi lemparan. Blok tangkapan menangkap pengecualian, dan outputnya adalah:

"Nama orang tidak boleh bermula dengan huruf kecil!"

Kali ini, jenis yang dilemparkan dan ditangkap adalah char.

Lebih daripada Satu Catch-Blocks untuk One Try-block:

Terdapat lebih dari satu blok penangkap untuk satu blok percubaan. Bayangkan keadaan di mana input boleh menjadi salah satu watak papan kekunci, tetapi bukan digit dan bukan abjad. Dalam kes ini, mesti ada dua blok penangkap: satu untuk bilangan bulat untuk memeriksa digit dan satu untuk huruf untuk memeriksa abjad. Kod berikut menggambarkan ini:

#sertakan
menggunakan ruang nama std;
input char = '*';
int utama ()

cuba

jika (isdigit (input))
baling 10;
jika (isalpha (input))
baling 'z';

tangkapan (int)

cout << "Digit input is forbidden!" << '\n';

tangkapan (char)

cout << "Character input is forbidden!" << '\n';

pulangan 0;

Tidak ada output. Sekiranya nilai input adalah digit, e.g., '1', outputnya adalah:

"Input digit dilarang!"

Sekiranya nilai input adalah abjad, e.g., 'a', outputnya adalah:

"Input watak dilarang!"

Perhatikan bahawa dalam senarai parameter dari dua blok penangkap, tidak ada nama pengenal. Perhatikan juga bahawa dalam definisi dua blok penangkap, argumen tertentu yang dilemparkan belum dapat disahkan sama ada nilainya tepat atau tidak.

Yang penting untuk tangkapan adalah jenisnya; tangkapan mesti sesuai dengan jenis operan yang dilemparkan. Nilai tertentu argumen (operan) yang dilemparkan dapat digunakan untuk pengesahan lebih lanjut jika diperlukan.

Lebih daripada satu Pengendali untuk Jenis yang Sama

Ada kemungkinan mempunyai dua pengendali dari jenis yang sama. Apabila pengecualian dilemparkan, kawalan dipindahkan ke pengendali terdekat dengan jenis yang sepadan. Program berikut menggambarkan ini:

#sertakan
menggunakan ruang nama std;
input char = '1';
int utama ()

cuba

jika (isdigit (input))
baling 10;

tangkapan (int)

cout << "Digit input is forbidden!" << '\n';

tangkapan (int)

cout << "Not allowed at all: digit input!" << '\n';

pulangan 0;

Keluarannya adalah:

"Input digit dilarang!"

Blok cubaan / tangkapan bersarang:

blok cubaan / tangkapan boleh bersarang. Program di atas untuk memasukkan aksara bukan alfanumerik dari papan kekunci diulang di sini, tetapi dengan kod ralat abjad bersarang:

#sertakan
menggunakan ruang nama std;
input char = '*';
int utama ()

cuba

jika (isdigit (input))
baling 10;
cuba

jika (isalpha (input))
baling 'z';

tangkapan (char)

cout << "Character input is forbidden!" << '\n';


tangkapan (int)

cout << "Digit input is forbidden!" << '\n';

pulangan 0;

Ralat abjad cubaan / tangkapan-tangkapan terletak di blok-blok kod digit. Operasi program ini dan operasi sebelumnya dari mana ia disalin adalah sama.

noexcept-specifier

Pertimbangkan fungsi berikut:

tidak sah fn (const char * str) kecuali

jika (lebih rendah (str [0]))
baling 'l';

Perhatikan penentu 'noexcept' tepat setelah tanda kurung kanan senarai parameter fungsi. Ini bermaksud bahawa fungsi tidak boleh membuang pengecualian. Sekiranya fungsi melontarkan pengecualian, seperti dalam kes ini, ia akan dikompilasi dengan pesan peringatan tetapi tidak akan berjalan. Percubaan untuk menjalankan program akan memanggil fungsi khas std :: terminate (), yang seharusnya menghentikan program dengan anggun, bukan hanya membiarkannya hancur secara harfiah.

Penentu noexcept dalam bentuk yang berbeza. Ini adalah seperti berikut:

taip func () kecuali; : tidak membenarkan ungkapan lontaran
taip func () noexcept (true); : membenarkan ungkapan lontaran
taip func () baling (); : tidak membenarkan ungkapan lontaran
taip func () noexcept (false); : membenarkan ungkapan lemparan, yang merupakan pilihan
taip func (); : membenarkan ungkapan lemparan, yang merupakan pilihan

benar atau salah dalam kurungan boleh digantikan dengan ungkapan yang menghasilkan benar atau salah.

Fungsi Istimewa :: terminate ():

Sekiranya pengecualian tidak dapat ditangani, ia harus dilemparkan semula. Dalam kes ini, ungkapan yang dilemparkan mungkin atau tidak mempunyai operan. Fungsi khas std :: terminate () akan dipanggil pada waktu runtime, yang seharusnya menghentikan program dengan anggun dan bukan hanya membiarkannya crash.

Taip, kompilasi, dan jalankan program berikut:

#sertakan
menggunakan ruang nama std;
input char = '1';
int utama ()

cuba

jika (isdigit (input))
baling 10;

tangkapan (int)

membuang;

pulangan 0;

Setelah penyusunan berjaya, program ditamatkan tanpa berjalan, dan mesej ralat dari komputer pengarang adalah:

"Berhenti dipanggil setelah membuang contoh 'int'

Dibatalkan (inti dibuang) "

Kesimpulan:

Ciri pengecualian dalam C ++ menghalang segmen kod daripada dijalankan berdasarkan beberapa jenis input. Program ini terus berjalan seperti yang diperlukan. Pembinaan pengecualian (pencegahan ralat) terdiri daripada blok percubaan dan blok penangkap. Blok cuba mempunyai segmen kod yang menarik, yang mungkin dilewati, bergantung pada beberapa keadaan input. Blok cuba mempunyai ungkapan lemparan, yang melemparkan operan. Operan ini juga disebut pengecualian. Sekiranya jenis operan dan jenis untuk parameter blok tangkapan adalah sama, maka pengecualian ditangkap (ditangani). Sekiranya pengecualian tidak tertangkap, program akan dihentikan, namun tetap aman kerana segmen kod yang harus dijalankan untuk memberikan hasil yang salah belum dilaksanakan. Pengendalian pengecualian khas bermaksud memintas segmen kod dan menghantar mesej ralat kepada pengguna. Segmen kod dijalankan untuk input normal tetapi dipintas untuk input yang salah.

Butang tetikus tengah tidak berfungsi pada Windows 10
The butang tetikus tengah membantu anda menelusuri halaman web dan skrin yang panjang dengan banyak data. Sekiranya ia berhenti, anda akan menggunakan...
Cara menukar butang tetikus Kiri & Kanan pada PC Windows 10
Sudah menjadi kebiasaan bahawa semua peranti tetikus komputer dirancang secara ergonomik untuk pengguna tangan kanan. Tetapi ada peranti tetikus yang ...
Tiru klik Tetikus dengan melayang menggunakan Mouse Tanpa Klik di Windows 10
Menggunakan tetikus atau papan kekunci dalam keadaan salah penggunaan berlebihan boleh menyebabkan banyak masalah kesihatan, termasuk ketegangan, sind...