Latihan - Melemparkan dan menangkap pengecualian dalam aplikasi konsol C#
Dalam latihan ini, Anda akan mengembangkan try blok kode dan catch klausul dalam pernyataan tingkat atas, membuat dan melempar pengecualian dalam MakeChange metode , lalu menyelesaikan catch blok kode menggunakan objek pengecualian. Anda menyelesaikan tugas-tugas berikut selama latihan ini:
- Memperbarui pernyataan tingkat atas: Menerapkan
try-catchpola dalam pernyataan tingkat atas. Bloktrykode akan berisi panggilan keMakeChange. - Metode pembaruan
MakeChange: Buat dan lempar pengecualian untuk masalah "Tidak cukup sampai" dan "Kurang pembayaran". -
catchPerbarui blok kode untuk menggunakan properti pengecualian yang dilemparkan. - Uji verifikasi: lakukan pengujian verifikasi untuk kode yang Anda kembangkan dalam latihan ini.
try-catch Menambahkan pola ke pernyataan tingkat atas
Dalam tugas ini, Anda akan mengapit panggilan ke metode di MakeChange dalam try pernyataan dan membuat klausa yang catch sesuai.
Pastikan file Program.cs terbuka di Editor Visual Studio Code.
Temukan baris kode berikut:
// MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); // Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }Luangkan waktu satu menit untuk mempertimbangkan tujuan kode ini.
Perhatikan bahwa
MakeChangemengembalikan nilai string. Nilai pengembalian ditetapkan ke variabel bernamatransactionMessage. JikatransactionMessagesama dengan "transaksi berhasil", maka biaya item yang dibeli ditambahkan keregisterCheckTillTotal. VariabelregisterCheckTillTotaldigunakan untuk memverifikasi saldo till yang dihitung denganMakeChangemetode .Untuk mengapit panggilan ke
MakeChangemetode dalamtryblok kode pernyataan, perbarui kode Anda sebagai berikut:try { // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); }Tambahkan klausa berikut
catchsetelahtryblok kode pernyataan:catch { }Anda akan selesai mengembangkan
catchklausul setelah membuat dan melemparkan pengecualian.
Membuat dan melemparkan pengecualian dalam MakeChange metode
Dalam tugas ini, Anda akan memperbarui MakeChange untuk membuat dan melemparkan pengecualian kustom saat transaksi tidak dapat diselesaikan.
Metode ini MakeChange mencakup dua masalah yang harus mengakibatkan pengecualian:
Masalah kurang bayar: Masalah ini terjadi ketika pelanggan menawarkan pembayaran yang kurang dari biaya item. Jika pelanggan belum menawarkan pembayaran yang memadai,
MakeChangeharus memberikan pengecualian.Masalah laci kas tidak cukup: Masalah ini terjadi ketika laci kas tidak memiliki uang kertas yang diperlukan untuk memberikan kembalian yang tepat. Jika sampai tidak dapat membuat perubahan yang tepat,
MakeChangeharus melemparkan dan pengecualian.
Gulir ke bawah untuk menggunakan metode
MakeChange.Temukan baris kode berikut:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Luangkan waktu satu menit untuk mempertimbangkan masalah yang ditangani kode ini.
Jika
changeNeededkurang dari nol, pelanggan belum memberikan cukup uang untuk menutupi harga pembelian barang yang mereka beli. Harga pembelian dan uang yang disediakan oleh pelanggan adalah parameterMakeChangemetode . Metode ini tidak dapat menyelesaikan transaksi ketika pelanggan tidak memberikan cukup uang. Dengan kata lain, operasi gagal.Ada dua jenis pengecualian yang tampaknya cocok dengan kondisi ini:
-
InvalidOperationException: PengecualianInvalidOperationExceptionhanya boleh dilemparkan ketika kondisi operasi metode tidak mendukung keberhasilan penyelesaian panggilan metode tertentu. Dalam hal ini kondisi operasi ditetapkan oleh parameter yang disediakan ke metode . -
ArgumentOutOfRangeException- PengecualianArgumentOutOfRangeExceptionhanya boleh dilemparkan ketika nilai argumen berada di luar rentang nilai yang diizinkan seperti yang didefinisikan oleh metode yang dipanggil. Dalam hal ini uang yang diberikan harus lebih besar dari biaya barang.
Salah satu jenis pengecualian dapat berfungsi, tetapi
InvalidOperationExceptionsedikit lebih cocok dalam konteks aplikasi ini.-
Perbarui kode sebagai berikut:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Gulir ke bawah untuk menemukan baris kode berikut:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Luangkan waktu satu menit untuk mempertimbangkan masalah yang ditangani kode ini.
Jika
changeNeededlebih besar dari nol setelahwhileperulangan yang menyiapkan perubahan, maka sampai kehabisan tagihan yang dapat digunakan untuk membuat perubahan. Metode ini tidak dapat menyelesaikan transaksi ketika sampai tidak memiliki tagihan yang diperlukan untuk membuat perubahan. Dengan kata lain, operasi gagal.Pengecualian
InvalidOperationExceptionharus digunakan untuk membuat pengecualian.Perbarui kode sebagai berikut:
if (changeNeeded > 0) throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
catch Menyelesaikan blok kode
Dalam tugas ini, Anda akan memperbarui catch klausul untuk menangkap jenis pengecualian tertentu.
Gulir ke atas di
MakeChangeatas metode , dan temukan kode berikut:catch { }Untuk menangkap jenis pengecualian yang dilemparkan dalam
MakeChangemetode , perbarui kode sebagai berikut:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }Objek
InvalidOperationExceptionpengecualian yang dilemparkanMakeChangeakan tertangkap, tetapi jenis pengecualian lainnya tidak akan tertangkap. Karena Anda tidak siap untuk menangani jenis pengecualian lainnya, penting untuk membiarkannya ditangkap lebih rendah di tumpukan panggilan. Jika Anda menyadari bahwa jenis pengecualian lain diharapkan dalamMakeChange, Anda dapat menambahkan klausul tambahancatch.Gunakan menu File untuk menyimpan pembaruan Anda.
Mengonversi metode MakeChange dari "string" menjadi "void" dan mengakses properti pengecualian
Dalam tugas ini, Anda akan memperbarui MakeChange menjadi tipe void, lalu menggunakan properti pengecualian untuk mengomunikasikan detail masalah kepada pengguna.
Gulir ke bagian
MakeChangeatas metode.Untuk mengonversi
MakeChangemetode dari jenisstringke jenisvoid, perbarui kode sebagai berikut:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Hapus deklarasi variabel berikut:
string transactionMessage = "";Gulir ke bagian
MakeChangebawah metode.Hapus baris kode berikut:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Gulir ke atas ke pernyataan tingkat atas dan temukan
tryblok kode.tryPerbarui blok kode sebagai berikut:try { // MakeChange manages the transaction and updates the till MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; }Temukan lalu hapus baris kode berikut:
// Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }tryBlok kode dancatchsekarang mengkomunikasikan pesan transaksi "sukses" dan "kegagalan" kepada pengguna. Karena properti pengecualianMessagemenjelaskan masalah, satuConsole.WriteLine()pernyataan membahas kedua masalah tersebut. Kode Anda lebih mudah dibaca dan dikelola setelah pembaruan ini.Gunakan menu File untuk menyimpan pembaruan Anda.
Periksa pekerjaan Anda
Dalam tugas ini, Anda akan menjalankan aplikasi dan memverifikasi bahwa kode yang diperbarui berfungsi seperti yang dimaksudkan.
Gulir ke atas untuk menemukan perulangan
whiledi pernyataan tingkat atas.Perulangan ini digunakan untuk melakukan iterasi melalui transaksi.
Temukan kode berikut beberapa baris sebelum perulangan dimulai
while.int transactions = 10;Perbarui jumlah transaksi menjadi
40sebagai berikut:int transactions = 40;Temukan baris kode berikut di dalam perulangan
while.int itemCost = valueGenerator.Next(2, 20);itemCostPerbarui generator angka acak sebagai berikut:int itemCost = valueGenerator.Next(2, 50);Rentang biaya ini adalah kecocokan yang lebih baik untuk item yang akan dibeli pelanggan.
Gunakan menu File untuk menyimpan pembaruan Anda.
Pada menu Jalankan, pilih Mulai Debug.
Tinjau output di panel TERMINAL.
Verifikasi bahwa pesan yang terkait dengan dua jenis pengecualian ditampilkan:
Laporan transaksi Anda harus menyertakan pesan "Tidak dapat menyelesaikan transaksi" berikut:
Customer is making a $42 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 0 one dollar bills Could not complete transaction: InvalidOperationException: Not enough money provided to complete the transaction.Customer is making a $23 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 1 one dollar bills Cashier prepares the following change: A five A five A one A one Could not complete transaction: InvalidOperationException: The till is unable to make change for the cash provided.
Selamat, Anda telah men-debug aplikasi kasir untuk memperbaiki masalah logika kode, dan Anda telah memperbarui aplikasi untuk menggunakan teknik penanganan pengecualian yang tepat.
Catatan
Output yang dilaporkan menunjukkan bahwa uang sampai tidak lagi seimbang. Ada bug logika tambahan dalam kode. Modul proyek tantangan tersedia jika Anda tertarik untuk menunjukkan keterampilan penelusuran kesalahan Visual Studio Code Anda!