iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Software Development

C#世界初探險系列 第 23

2022鐵人賽 Day 23 自訂例外處理

  • 分享至 

  • xImage
  •  

嗨嗨~今天要來說說自訂例外處理
如果我們遇到特殊錯誤,系統並沒有提供此種判斷,自己也可以另外寫程式來處理特殊錯誤,throw即可完成。
假設現在輸入成績0~100不發生錯誤,如果超過範圍或其他字串資料就顯示錯誤,程式如下:

namespace project
{
    internal class Program
    {
        private static void KeyInScore(out int score)
        {
            Console.Write("輸入成績(0~100):");
            score = int.Parse(Console.ReadLine());
            if (score < 0 || score > 100)
                throw new ArgumentOutOfRangeException();
            else
                Console.WriteLine("成績正常");
        }
        static void Main(string[] args)
        {
            int score;
            while(true)
            {
                try
                {
                    KeyInScore(out score);
                    break;
                }
                catch(ArgumentOutOfRangeException ex)
                {
                    Console.WriteLine("不合範圍成績");
                }
                catch(Exception ex)
                {
                    Console.WriteLine("非數字輸入");
                }
            }
        }
    }
}

若 .NET Framework所提供的例外類別不夠使用,可以使用物件導向繼承的機制,將系統提供的例外加入延伸、增加功能,且也可以覆寫原有系統例外類別的方法及屬性,或增加新的方法或屬性。
我們來做個練習,假設我們現在要給員工分配薪水,薪水必須要高於23000,如果超過23000就會產生SalaryException例外類別,此類別是我們自訂的,繼承自Exception例外類別,SalaryException覆寫ToString()及Message,再新增ShowMsg()。

namespace project
{
    class SalaryException:Exception
    {
        public override String ToString()
        {
            return "發生薪水例外錯誤";
        }
        public override String Message
        {
            get
            {
                return "薪水不能低於23000";

            }
        }
        public void ShowMsg()
        {
            Console.WriteLine("如果薪水低於23000,將會通報勞動局。");
        }
    }
    class Empolyee
    {
        private string _name;
        private int _salary;
        public Empolyee(string name)
        {
            _name = name;
        }
        public int Salary
        {
            get
            {
                return _salary;
            }
            set
            {
                if(value<23000)
                {
                    Console.WriteLine("員工{0}薪水{1}設定失敗", _name, value);
                    throw new SalaryException();
                }
                else
                {
                    _salary = value;
                }
            }
        }
        public void ShowSalary()
        {
            Console.WriteLine("員工{0}的薪水{1}", _name, Salary);
        }
    }
    internal class Program
    {
        static void Main(string[] args)
    {
            try
            {
                Empolyee tom = new Empolyee("湯姆");
                tom.Salary = 50000;
                tom.ShowSalary();
                Console.WriteLine("===============");
                Empolyee peter = new Empolyee("彼得");
                peter.Salary = 22000;
                peter.ShowSalary();
            }
            catch(SalaryException ex)
            {
                Console.WriteLine(ex.ToString());
                Console.WriteLine(ex.Message);
                ex.ShowMsg();
            }
        }
    }
}

今天就先這樣啦~
大家掰掰


上一篇
2022鐵人賽 Day 22 例外(try)處理
下一篇
2022鐵人賽 Day 24 System.IO常用類別介紹
系列文
C#世界初探險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言