一、请简述Exception 的作用定义和使用场景

定义:程序中的运行时错误,它违反一个系统约束或应用程序约束,或出现了在正常操作时未预料的情形。
使用场景:分为系统异常和自定义异常。常见的系统异常有:ArithmeticException(算数异常),NullReferenceException(空引用异常),IndexOutOfRangeException(索引越界异常),InvalidOperationException(无效操作异常)等。异常处理包括:try-catch块,finally块,throw关键字以及使用using语句处理资源。

二、异常捕获练习

题目 1: 除法计算器

编写一个程序,读取两个整数并进行除法运算。如果除数为零,程序应捕获 DivideByZeroException 异常,并输出适当的错误消息。
要求:
用户输入两个整数。
捕获除零异常,并输出错误信息。

using System;
using System.Diagnostics;
using System.Drawing;


namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            string x=Console.ReadLine();
            string y=Console.ReadLine();
            int a=Convert.ToInt32(x);
            int b=Convert.ToInt32(y);
            compute(a,b);
            Console.ReadKey();
        }
        
        public static void compute(int x, int y)
        {
            try
            {
                if(y==0)
                {
                    x /= y;
                }
            }
            catch(System.DivideByZeroException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

题目 2: 文件读取

编写一个程序,尝试从指定文件中读取内容。如果文件不存在或路径无效,程序应捕获 FileNotFoundException 异常,并输出适当的错误消息。
要求:
使用 System.IO 命名空间中的 FileNotFoundException 异常。
捕获文件未找到异常,并输出错误信息。

using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Read();
            Console.ReadKey();
        }
        
        public static void Read()
        {
            try
            {
                FileStream file = new FileStream("C:\\test.txt", FileMode.Open);
                file.Close();
            }
            catch(System.IO.FileNotFoundException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

题目 3: 数字转换

编写一个程序,尝试将用户输入的字符串转换为整数。如果输入的字符串不是有效的数字,程序应捕获 FormatException 异常,并输出适当的错误消息。
要求:
用户输入一个字符串。
尝试将其转换为整数。
捕获格式异常,并输出错误信息。

using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            string a=Console.ReadLine();
            string b=Console.ReadLine();
            Change(a,b);
            Console.ReadKey();
        }
        
        public static void Change(string a,string b)
        {
            try
            {
                int x = Convert.ToInt32(a); int y = Convert.ToInt32(b);   
            }
            catch(System.FormatException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

题目 4: 数组访问

编写一个程序,尝试访问数组中的一个元素。如果索引超出数组的范围,程序应捕获 IndexOutOfRangeException 异常,并输出适当的错误消息。
要求:
创建一个整数数组。
用户输入一个索引。
捕获数组索引越界异常,并输出错误信息。

using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Read();
            Console.ReadKey();
        }
        
        public static void Read()
        {
            int[] nums = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            try
            {
                int x = nums[11];   
            }
            catch(System.IndexOutOfRangeException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

题目 5: 自定义异常

定义一个自定义异常类 InvalidAgeException,继承Exception,用来表示用户输入的年龄不合法(小于0或大于150)。编写一个程序,使用 InvalidAgeException 捕获这种非法年龄输入的异常,并输出适当的错误消息。
要求:
定义 InvalidAgeException 类。
用户输入年龄,检查是否合法,并使用自定义异常进行捕获。

using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            string a = Console.ReadLine();
            int n=Convert.ToInt32(a);
            Age(n);
            Console.ReadKey();
        }
        
        public static void Age(int n)
        {

            if (n < 0 || n > 150)
            {
                throw new InvalidAgeException("年龄不合法");
            }
        }
    }
}


public class InvalidAgeException : System.Exception {
    public InvalidAgeException() { }
    public InvalidAgeException(string message) : base(message) { }
    public InvalidAgeException(string message,object invalidObject) : base(message) { }
}

三、使用C#实现建造者模式,并说明其模式的适用场景

using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class Actor
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Sex { get; set; }
    }


    public interface IActorBuider
    {
        Actor Product { get; set; }
        void CreateName();
        void CreateAge();
        void CreateSex();
        Actor ReturnResult();
    }

    public class AngleBuilder : IActorBuider
    {
        private Actor _product;

        public Actor Product
        {
            get
            {
                if (_product == null)
                {
                    _product = new Actor();
                }
                return _product;
            }
            set => _product = value;
        }

        public void CreateName()
        {
            Product.Name = "天使";
        }

        public void CreateAge()
        {
            Product.Age = 20;
        }

        public void CreateSex()
        {
            Product.Sex = "女";
        }

        public Actor ReturnResult()
        {
            return Product;
        }
    }


        public class ActorDirector
        {
            private IActorBuider _builder;

            public void SetBuilder(IActorBuider builder)
            {
                _builder = builder;
            }

            public Actor Constructor()
          {
            _builder.CreateName();
            _builder.CreateAge();
            _builder.CreateSex();
           return  _builder.ReturnResult();
          }
        }


    public class Program
    {
        static void Main(string[] args)
        {
            ActorDirector ad= new ActorDirector();
            ad.SetBuilder(new AngleBuilder());
            Actor actor=ad.Constructor();
            Console.WriteLine($"名称为:{actor.Name}");
            Console.WriteLine($"年龄为:{actor.Age}");
            Console.WriteLine($"性别为:{actor.Sex}");
        }
    }
}

四、使用C#实现原型模式,并说明其模式的适用场景

using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public abstract class Prototype
    {
        public abstract void Fight();
        public abstract void BegAlms();
        public abstract Prototype Clone();
    }

    public sealed class XingZheSunPrototype : Prototype
    {
        public override void Fight()
        {
            Console.WriteLine("腾云驾雾,各种武艺");
        }
        public override void BegAlms()
        {
            Console.WriteLine("什么都能要来");
        }
        public override Prototype Clone()
        {
            return (XingZheSunPrototype)this.MemberwiseClone();
        }
    }

    public sealed class SunXingZhePrototype : Prototype
    {
        public override void Fight()
        {
            Console.WriteLine("七十二变");
        }
        public override void BegAlms()
        {
            Console.WriteLine("只能要来水果");
        }
        public override Prototype Clone()
        {
            return (SunXingZhePrototype)this.MemberwiseClone();
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            Prototype xingzhesun=new XingZheSunPrototype();
            Prototype xingzhesun2=xingzhesun.Clone();
            Prototype xingzhesun3= xingzhesun.Clone();

            Prototype sunxingzhe=new SunXingZhePrototype();
            Prototype sunxingzhe2=sunxingzhe.Clone();
            Prototype sunxingzhe3= sunxingzhe.Clone();
            Prototype sunxingzhe4= sunxingzhe.Clone();
            Prototype sunxingzhe5= sunxingzhe.Clone();

            sunxingzhe2.Fight();
            xingzhesun3.BegAlms();

            Console.Read();
        }
    }
}

五、使用C#实现适配器模式,并说明其模式的适用场景

using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
    public class TwoHoleTarget
    {
        public virtual void Request()
        {
            Console.WriteLine("两孔的充电器可以使用");
        }
    }
    public class ThreeHoleAdaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("我是三个孔的插头也可以使用了");
        }
    }

    public interface ITwoHoleTarget
    {
        void Request();
    }

    public class threeToTwoAdapter : ThreeHoleAdaptee, ITwoHoleTarget
    {
        public void Request()
        {
            this.SpecificRequest();
        }
    }

    public class ThreeToTwoAdapter : TwoHoleTarget
    {
        private ThreeHoleAdaptee threeHoleAdaptee = new ThreeHoleAdaptee();

        public override void Request()
        {
            threeHoleAdaptee.SpecificRequest();
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            TwoHoleTarget homeTwoHole = new ThreeToTwoAdapter();
            homeTwoHole.Request();
           

            ITwoHoleTarget change = new threeToTwoAdapter();
            change.Request();
            Console.ReadLine();
        }
    }
}

六、使用C#实现桥接模式,并说明其模式的适用场景

using ConsoleApp1;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace ConsoleApp1
{

    public abstract class Database
    {
        protected PlatformImplementor _implementor;

        protected Database(PlatformImplementor implementor)
        {
            this._implementor = implementor;
        }

        public abstract void Create();
    }

    public abstract class PlatformImplementor
    {
        public abstract void Process();
    }

    public class SqlServer2000 : Database
    {
        public SqlServer2000(PlatformImplementor implementor) : base(implementor){ }
            public override void Create()
        {
            this._implementor.Process();
        }
        }
    }

public class SqlServer2005 : Database
{
    public SqlServer2005(PlatformImplementor implementor) : base(implementor){ }
        public override void Create()
    {
        this._implementor.Process();
    }

}

public class SqlServer2000UnixImplementor : PlatformImplementor
{
    public override void Process()
    {
        Console.WriteLine("SqlServer2000针对Unix的具体实现");
    }
}

public sealed class SqlServer2005UnixImplementor : PlatformImplementor
{
    public override void Process()
    {
        Console.WriteLine("SqlServer2005针对Unix的具体实现");
    }
}



public class Program
    {
        static void Main(string[] args)
    {
        PlatformImplementor SqlServer2000UnixImp = new SqlServer2000UnixImplementor();
        PlatformImplementor SqlServer2005UnixImp = new SqlServer2005UnixImplementor();

        Database SqlServer2000Unix = new SqlServer2000(SqlServer2000UnixImp);
        Database SqlServer2005Unix = new SqlServer2005(SqlServer2005UnixImp);
        SqlServer2000Unix.Create();
        SqlServer2005Unix.Create();
        Console.ReadLine();
    }
}

七、使用C#实现装饰器模式,并说明其模式的适用场景

using ConsoleApp1;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace ConsoleApp1
{
    public abstract class House
    {
        public abstract void Renuvation();
    }

    public abstract class DecorationStrategy : House
    {
        protected House _house;

        protected DecorationStrategy(House house)
        {
            this._house = house;
        }

        public override void Renuvation()
        {
            if (this._house != null)
            {
                this._house.Renuvation();
            }
        }
    }

        public sealed class StarDengHouse : House {
            public override void Renuvation()
            {
                Console.WriteLine("装修StarDeng的房子");
            }
        }

        public sealed class HouseSecurityDecorator : DecorationStrategy
        {
            public HouseSecurityDecorator(House house) : base(house) { }

            public override void Renuvation()
            {
                base.Renuvation();
                Console.WriteLine("增加安全系统");
            }

        }

        public sealed class KeepWarmDecorator : DecorationStrategy
        {
            public KeepWarmDecorator(House house) : base(house) { }

            public override void Renuvation()
            {
                base.Renuvation();
                Console.WriteLine("增加了保温的功能");
            }
        }




    public class Program
    {
        static void Main(string[] args)
        {
            House myselfHouse = new StarDengHouse();

            DecorationStrategy securityHouse = new HouseSecurityDecorator(myselfHouse);
            securityHouse.Renuvation();

            DecorationStrategy securityAndWarmHouse = new KeepWarmDecorator(securityHouse);
            securityAndWarmHouse.Renuvation();

            Console.ReadLine();

        }
    }
}

八、使用C#实现外观模式,并说明其模式的适用场景

using ConsoleApp1;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace ConsoleApp1
{
    public class SystemA
    {
        public void MethodA()
        {
            Console.WriteLine("执行身份认证");
        }
    }

    public class SystemB
    {
        public void MethodB()
        {
            Console.WriteLine("执行系统安全检查");
        }
    }

    public class SystemC
    {
        public void MethodC()
        {
            Console.WriteLine("执行网银安全检查");
        }
    }

    public class SystemFacade
    {
        private SystemA auth;
        private SystemB security;
        private SystemC netbank;

        public SystemFacade()
        {
            auth = new SystemA();
            security = new SystemB();
            netbank = new SystemC();
        }

        public void Buy()
        {
            auth.MethodA();
            security.MethodB();
            netbank.MethodC();

            Console.WriteLine("我已经成功购买了");
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            SystemFacade facade = new SystemFacade();
            facade.Buy();

            Console.ReadKey();
        }
    }
}
08-07 22:25