Latihan - Melemparkan dan menangkap pengecualian dalam aplikasi konsol C#

Selesai

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:

  1. Memperbarui pernyataan tingkat atas: Menerapkan try-catch pola dalam pernyataan tingkat atas. Blok try kode akan berisi panggilan ke MakeChange.
  2. Metode pembaruan MakeChange : Buat dan lempar pengecualian untuk masalah "Tidak cukup sampai" dan "Kurang pembayaran".
  3. catch Perbarui blok kode untuk menggunakan properti pengecualian yang dilemparkan.
  4. 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.

  1. Pastikan file Program.cs terbuka di Editor Visual Studio Code.

  2. 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}");
    }
    
  3. Luangkan waktu satu menit untuk mempertimbangkan tujuan kode ini.

    Perhatikan bahwa MakeChange mengembalikan nilai string. Nilai pengembalian ditetapkan ke variabel bernama transactionMessage. Jika transactionMessage sama dengan "transaksi berhasil", maka biaya item yang dibeli ditambahkan ke registerCheckTillTotal. Variabel registerCheckTillTotal digunakan untuk memverifikasi saldo till yang dihitung dengan MakeChange metode .

  4. Untuk mengapit panggilan ke MakeChange metode dalam try blok 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);
    }
    
  5. Tambahkan klausa berikut catch setelah try blok kode pernyataan:

    catch
    {
    }
    

    Anda akan selesai mengembangkan catch klausul 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, MakeChange harus 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, MakeChange harus melemparkan dan pengecualian.

  1. Gulir ke bawah untuk menggunakan metode MakeChange.

  2. Temukan baris kode berikut:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Luangkan waktu satu menit untuk mempertimbangkan masalah yang ditangani kode ini.

    Jika changeNeeded kurang dari nol, pelanggan belum memberikan cukup uang untuk menutupi harga pembelian barang yang mereka beli. Harga pembelian dan uang yang disediakan oleh pelanggan adalah parameter MakeChange metode . 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: Pengecualian InvalidOperationException hanya 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 - Pengecualian ArgumentOutOfRangeException hanya 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 InvalidOperationException sedikit lebih cocok dalam konteks aplikasi ini.

  4. Perbarui kode sebagai berikut:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Gulir ke bawah untuk menemukan baris kode berikut:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Luangkan waktu satu menit untuk mempertimbangkan masalah yang ditangani kode ini.

    Jika changeNeeded lebih besar dari nol setelah while perulangan 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 InvalidOperationException harus digunakan untuk membuat pengecualian.

  7. 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.

  1. Gulir ke atas di MakeChange atas metode , dan temukan kode berikut:

    catch
    {
    }    
    
  2. Untuk menangkap jenis pengecualian yang dilemparkan dalam MakeChange metode , perbarui kode sebagai berikut:

    catch (InvalidOperationException e)
    {
        Console.WriteLine($"Could not complete transaction: {e.Message}");
    }    
    

    Objek InvalidOperationException pengecualian yang dilemparkan MakeChange akan 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 dalam MakeChange, Anda dapat menambahkan klausul tambahan catch .

  3. 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.

  1. Gulir ke bagian MakeChange atas metode.

  2. Untuk mengonversi MakeChange metode dari jenis string ke jenis void, perbarui kode sebagai berikut:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Hapus deklarasi variabel berikut:

    string transactionMessage = "";
    
  4. Gulir ke bagian MakeChange bawah metode.

  5. Hapus baris kode berikut:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Gulir ke atas ke pernyataan tingkat atas dan temukan try blok kode.

  7. try Perbarui 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;
    }
    
  8. 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}");
    }
    
    

    try Blok kode dan catch sekarang mengkomunikasikan pesan transaksi "sukses" dan "kegagalan" kepada pengguna. Karena properti pengecualian Message menjelaskan masalah, satu Console.WriteLine() pernyataan membahas kedua masalah tersebut. Kode Anda lebih mudah dibaca dan dikelola setelah pembaruan ini.

  9. 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.

  1. Gulir ke atas untuk menemukan perulangan while di pernyataan tingkat atas.

    Perulangan ini digunakan untuk melakukan iterasi melalui transaksi.

  2. Temukan kode berikut beberapa baris sebelum perulangan dimulai while .

    int transactions = 10;
    
    
  3. Perbarui jumlah transaksi menjadi 40 sebagai berikut:

    int transactions = 40;
    
    
  4. Temukan baris kode berikut di dalam perulangan while .

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. itemCost Perbarui 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.

  6. Gunakan menu File untuk menyimpan pembaruan Anda.

  7. Pada menu Jalankan, pilih Mulai Debug.

  8. Tinjau output di panel TERMINAL.

  9. 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!