C++

Penanganan Pengecualian di C++

Penanganan Pengecualian di C++
Ada tiga jenis kesalahan perangkat lunak yang ada:. Ini adalah Kesalahan Sintaks, Kesalahan Logika, dan Kesalahan Runtime.

Kesalahan Sintaks

Ekspresi, pernyataan, atau konstruksi yang salah diketik adalah kesalahan sintaksis.

Perhatikan dua pernyataan berikut:

int arr[] = 1, 2, 3; //benar
int arr = 1, 2, 3; //kesalahan sintaks, hilang []

Mereka adalah definisi dari array yang sama. Yang pertama benar. Yang kedua tidak ada [], dan itu adalah kesalahan sintaksis. Program dengan kesalahan sintaks tidak berhasil dikompilasi. Kompilasi gagal dengan pesan kesalahan yang menunjukkan kesalahan sintaksis. Hal yang baik adalah bahwa kesalahan sintaks selalu dapat diperbaiki jika programmer tahu apa yang dia lakukan.

Kesalahan Logika

Kesalahan logika adalah kesalahan yang dilakukan oleh programmer ketika beberapa pengkodean logis yang salah dibuat. Ini mungkin hasil dari ketidaktahuan dari programmer terhadap fitur bahasa pemrograman atau kesalahpahaman tentang apa yang harus dilakukan oleh program.

Dalam situasi ini, program berhasil dikompilasi. Program bekerja dengan baik, tetapi menghasilkan hasil yang salah. Kesalahan seperti itu mungkin karena membuat loop berulang 5 kali ketika dibuat untuk mengulangi 10 kali. Mungkin juga sebuah loop secara tidak sadar dibuat untuk mengulangi tanpa batas. Satu-satunya cara untuk mengatasi kesalahan semacam ini adalah dengan melakukan pemrograman yang cermat dan menguji program secara menyeluruh sebelum menyerahkannya kepada pelanggan.

Kesalahan Waktu Proses

Input yang salah atau luar biasa menyebabkan kesalahan runtime. Dalam hal ini, program berhasil dikompilasi dan bekerja dengan baik dalam banyak situasi. Dalam situasi tertentu, program macet (dan berhenti).

Bayangkan bahwa dalam segmen kode program, 8 harus dibagi dengan sejumlah penyebut. Jadi jika pembilang 8 dibagi dengan penyebut 4, jawabannya (hasil bagi) adalah 2. Namun, jika pengguna memasukkan 0 sebagai penyebut, program akan macet. Pembagian dengan 0 tidak diperbolehkan dalam Matematika, dan juga tidak diperbolehkan dalam komputasi. Pembagian dengan nol harus dicegah dalam pemrograman. Penanganan pengecualian menangani kesalahan runtime, seperti pembagian dengan nol. Program berikut menunjukkan cara menangani masalah pembagian dengan nol tanpa menggunakan fitur pengecualian di C++:

#termasuk
menggunakan namespace std;
int utama()

int pembilang = 8;
int penyebut = 2;
jika (penyebut != 0 )

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

lain

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

kembali 0;

Keluarannya adalah 4. Jika penyebutnya 0, hasilnya adalah:

“Pembagian dengan nol tidak diizinkan!”

Kode utama di sini adalah konstruksi if-else. Jika penyebutnya bukan 0, pembagian akan terjadi; jika 0, pembagian tidak akan terjadi. Pesan kesalahan akan dikirim ke pengguna, dan program terus berjalan tanpa macet. Kesalahan runtime biasanya ditangani dengan menghindari eksekusi segmen kode dan mengirimkan pesan kesalahan ke pengguna.

Fitur pengecualian di C++ menggunakan blok coba untuk blok if dan blok tangkap untuk blok lain untuk menangani kesalahan, seperti berikut:

#termasuk
menggunakan namespace std;
int utama()

int pembilang = 8;
int penyebut = 2;
mencoba

jika (penyebut != 0 )

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

lain

melempar 0;


tangkap (int err)

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

kembali 0;

Perhatikan bahwa tajuk coba tidak memiliki argumen. Perhatikan juga bahwa catch-block, yang seperti definisi fungsi, memiliki parameter. Jenis parameter harus sama dengan operan (argumen) dari ekspresi lempar. Ekspresi lemparan ada di blok coba. Itu melempar argumen pilihan programmer yang terkait dengan kesalahan, dan catch-block menangkapnya. Dengan cara itu, kode di blok coba tidak dieksekusi. Kemudian, catch-block menampilkan pesan kesalahan.

Artikel ini menjelaskan penanganan pengecualian di C in++. Pengetahuan dasar dalam C++ merupakan prasyarat bagi pembaca untuk memahami artikel ini.

Isi Artikel:

  • Fungsi Melempar Pengecualian
  • Lebih dari Satu Tangkapan-Blok untuk Satu Coba-blok
  • Blok coba/tangkap bersarang
  • noexcept-specifier
  • Fungsi std::terminate() Khusus
  • Kesimpulan

Fungsi Melempar Pengecualian:

Suatu fungsi juga dapat mengeluarkan pengecualian seperti yang dilakukan blok coba. Pelemparan terjadi dalam definisi fungsi. Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
batal fn(const char* str)

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

int utama()

mencoba

fn("pandai besi");

menangkap (char ch)

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

kembali 0;

Perhatikan bahwa kali ini, blok try baru saja memiliki pemanggilan fungsi. Ini adalah fungsi yang disebut yang memiliki operasi lemparan. Blok catch menangkap pengecualian, dan hasilnya adalah:

“Nama orang tidak boleh dimulai dengan huruf kecil!”

Kali ini, tipe yang dilempar dan ditangkap adalah char.

Lebih dari Satu Blok Tangkapan untuk Satu Blok Coba:

Mungkin ada lebih dari satu catch-block untuk satu try-block. Bayangkan situasi di mana input dapat berupa karakter apa pun dari keyboard, tetapi bukan angka dan bukan alfabet. Dalam hal ini, harus ada dua catch-block: satu untuk integer untuk memeriksa digit dan satu untuk char untuk memeriksa alfabet. Kode berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
masukan karakter = '*';
int utama()

mencoba

jika (isdigit(masukan))
melempar 10;
jika (isalpha(masukan))
melempar 'z';

tangkap (int)

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

menangkap (char)

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

kembali 0;

Tidak ada keluaran. Jika nilai input adalah digit, e.g., '1', outputnya adalah:

"Input digit dilarang!"

Jika nilai input adalah alfabet, e.g., 'a', hasilnya adalah:

"Masukan karakter dilarang!"

Perhatikan bahwa dalam daftar parameter dari dua blok tangkap, tidak ada nama pengenal. Perhatikan juga bahwa dalam definisi dua blok tangkap, argumen tertentu yang dilontarkan belum diverifikasi apakah nilainya eksak atau tidak.

Yang penting untuk tangkapan adalah jenisnya; tangkapan harus cocok dengan jenis operan yang dilempar. Nilai tertentu dari argumen (operan) yang dilempar dapat digunakan untuk verifikasi lebih lanjut jika diperlukan.

Lebih dari satu Handler untuk Tipe yang Sama

Dimungkinkan untuk memiliki dua penangan dengan tipe yang sama. Saat pengecualian dilemparkan, kontrol ditransfer ke penangan terdekat dengan tipe yang cocok. Program berikut menggambarkan hal ini:

#termasuk
menggunakan namespace std;
masukan karakter = '1';
int utama()

mencoba

jika (isdigit(masukan))
melempar 10;

tangkap (int)

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

tangkap (int)

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

kembali 0;

Outputnya adalah:

"Input digit dilarang!"

Blok coba/tangkap bersarang:

coba/tangkap blok dapat bersarang. Program di atas untuk memasukkan karakter non-alfanumerik dari keyboard diulang di sini, tetapi dengan kode kesalahan alfabet bersarang:

#termasuk
menggunakan namespace std;
masukan karakter = '*';
int utama()

mencoba

jika (isdigit(masukan))
melempar 10;
mencoba

jika (isalpha(masukan))
melempar 'z';

menangkap (char)

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


tangkap (int)

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

kembali 0;

Kesalahan alfabet try/catch-block bersarang di try-block dari kode digit. Operasi program ini dan operasi sebelumnya dari mana program itu disalin adalah sama.

noexcept-specifier

Perhatikan fungsi berikut:

void fn(const char* str) tidak ada kecuali

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

Perhatikan specifier 'noexcept' tepat setelah tanda kurung kanan dari daftar parameter fungsi. Ini berarti bahwa fungsi tersebut tidak boleh mengeluarkan pengecualian. Jika fungsi melempar pengecualian, seperti dalam kasus ini, ia akan dikompilasi dengan pesan peringatan tetapi tidak akan berjalan. Upaya untuk menjalankan program akan memanggil fungsi khusus std::terminate(), yang seharusnya menghentikan program dengan anggun alih-alih membiarkannya benar-benar crash.

Penentu noexcept dalam bentuk yang berbeda. Ini adalah sebagai berikut:

ketik func() tanpa kecuali; : tidak mengizinkan ekspresi lemparan
ketik func() noexcept(benar); : memungkinkan ekspresi lemparan
ketik func() lempar(); : tidak mengizinkan ekspresi lemparan
ketik func() noexcept(salah); : memungkinkan ekspresi lemparan, yang opsional
ketik fungsi(); : memungkinkan ekspresi lemparan, yang opsional

benar atau salah dalam tanda kurung dapat diganti dengan ekspresi yang menghasilkan benar atau salah.

Fungsi std::terminate() Khusus:

Jika pengecualian tidak dapat ditangani, itu harus dilemparkan kembali. Dalam hal ini, ekspresi yang dilempar mungkin atau mungkin tidak memiliki operan. Fungsi khusus std::terminate() akan dipanggil saat runtime, yang seharusnya menghentikan program dengan anggun alih-alih membiarkannya benar-benar crash.

Ketik, kompilasi, dan jalankan program berikut:

#termasuk
menggunakan namespace std;
masukan karakter = '1';
int utama()

mencoba

jika (isdigit(masukan))
melempar 10;

tangkap (int)

melemparkan;

kembali 0;

Setelah kompilasi berhasil, program dihentikan tanpa berjalan, dan pesan kesalahan dari komputer penulis adalah:

“terminate dipanggil setelah melempar instance 'int'

Dibatalkan (inti dibuang)”

Kesimpulan:

Fitur pengecualian di C++ mencegah segmen kode dieksekusi berdasarkan beberapa jenis input. Program terus dijalankan sesuai kebutuhan. Konstruksi pengecualian (pencegahan kesalahan) terdiri dari blok coba dan blok tangkap. Blok coba memiliki segmen kode yang diinginkan, yang dapat dilewati, tergantung pada beberapa kondisi input. Blok coba memiliki ekspresi lemparan, yang melempar operan. Operan ini juga disebut pengecualian. Jika tipe operan dan tipe parameter blok catch sama, maka eksepsi ditangkap (ditangani). Jika pengecualian tidak tertangkap, program akan dihentikan, tetapi tetap aman karena segmen kode yang akan dieksekusi untuk memberikan hasil yang salah belum dieksekusi. Penanganan pengecualian tipikal berarti melewati segmen kode dan mengirim pesan kesalahan ke pengguna. Segmen kode dijalankan untuk input normal tetapi dilewati untuk input yang salah.

Tutorial OpenTTD
OpenTTD adalah salah satu game simulasi bisnis paling populer di luar sana. Dalam game ini, Anda perlu membuat bisnis transportasi yang luar biasa. Na...
SuperTuxKart untuk Linux
SuperTuxKart adalah judul hebat yang dirancang untuk memberi Anda pengalaman Mario Kart gratis di sistem Linux Anda. Ini cukup menantang dan menyenang...
Pertempuran untuk Tutorial Westnoth
The Battle for Wesnoth adalah salah satu game strategi open source terpopuler yang bisa kamu mainkan saat ini. Tidak hanya game ini telah dikembangkan...