ホームページ  >  記事  >  バックエンド開発  >  C#基礎知識編:基礎知識(13)例外

C#基礎知識編:基礎知識(13)例外

黄舟
黄舟オリジナル
2017-02-11 13:29:531365ブラウズ

コードを書くとき、動作中に常にプログラムのクラッシュを引き起こす特定の問題に遭遇することがよくあります。これは、プログラマーのレベルが低いためではなく、ビジネス ロジック、オペレーティング システム、またはコンピューターなどの他の機器に問題があるためです。たとえば、このファイルが削除された場合、user32.dll の一部のメソッドがよく使用されます。 、プログラムはまだ実行できません。もちろん、熟練したプログラマは、プログラムを作成するときに常にさまざまな状況を考慮する必要があります。レベルが高くなるほど、考慮する必要がある状況が増え、考慮するほどプログラムがクラッシュする可能性は低くなります。堅牢性が向上します。
一般に、プログラムが実行できない場合は 2 つの状況があります:
1 つはエラーです。これには、環境エラー (ファイルの欠落、不正なファイル内容によるプログラム契約との不一致、サポートされていないシステム バージョンなど) が含まれます。 (メモリ不足によるメモリ割り当ての失敗など)。これは一般に、プロセス エラーがプログラム内で間違った結果を引き起こすことなどです)
2 つ目は例外です。例外は、現在のプロセスの要因または予期しない動作によりプログラムが実行できないことを意味します。一般的には以下が含まれます: 不正な操作、ユーザーによる間違った指示の入力、異常な入出力、ハードディスクの読み取りおよび書き込み時などの外部デバイスへのアクセス時のハードウェア以外の問題。その結果、外部の仮想光学式ドライブやフロッピー ディスクなどが破損します。ハードディスクと兼用、またはプログラム自体 問題はありませんが、ハードディスクからの読み書き時にエラーが報告され、メモリの割り当てが異常であり、メモリが不足している場合は新しいオブジェクトを作成できません。
一般に、エラーと例外の間には重要な違いがあります。エラーが発生すると、プログラムを変更する必要があり、例外はプログラムの一部であり、変更されると発生します。どのようなプログラムであっても、さまざまな種類の例外が発生した場合、プログラムは例外を処理する必要がありますが、例外がプログラムの継続的な動作に影響を与えるべきではありません。エラーの場合は、発生したときに修正してください。 C# での例外処理を見てみましょう。
一般に、プログラムが間違いを犯さないようにするために、多くの if...else の判断が行われます。しかし、たとえ偉大な人であっても、プログラムを包括的に考えて作成することはできません。あらゆる状況の。したがって、これが C# で例外処理を使用する方法です。 C# では、キャッチ アンド スロー モデルを使用して例外を処理します。プログラム内で例外が発生すると、例外が処理される場所で例外オブジェクトがキャプチャされます。スローされるのは、次のような Exception クラスまたはそのサブクラスのオブジェクトです。
ArgumentException: この例外は、パラメーターが不正な場合にスローされます。
ArgumentNullException: この例外は、パラメーターが null の場合にスローされます。
ArgumentOutOfRangeException: この例外は、パラメーターが許可された範囲を超えた場合にスローされます。
例外をキャッチする形式は次のとおりです:

            try
            {
                //代码段
            }
            catch (Exception ex)
            {
                //处理异常
            }
            finally
            {
                //最后一定执行的
            }

try コード ブロックは、例外をスローするために throw キーワードを使用するか、例外をスローする可能性のあるプロパティまたはメソッドにアクセスできます。コード ブロックは、キャッチされる例外をキャプチャするために使用され、例外を処理するコードが含まれます。

finally コード ブロックは、例外処理が完了した後に実行されるコード セグメントを表します。つまり、finally のコード セグメントは常に実行されます。例外がキャッチされたかどうかに関係なく、最後に。
次のコードを見てください:
Exception から継承されており、Exeption クラスを直感的に理解できます:

  public class MySelfException : Exception
    {
        /// <summary>
        /// 默认构造器
        /// </summary>
        public MySelfException()

            : base()
        {

        }
        /// <summary>
        /// 提供一个string类型的参数构造器,可设置自定义信息
        /// </summary>
        /// <param name="message"></param>
        public MySelfException(string message)

            : base(message)
        {

        }

        /// <summary>
        /// 用于传入异常信息,另外可以传入该异常有哪个其它异常引发的
        /// </summary>
        /// <param name="message"></param>
        /// <param name="innerException"></param>
        public MySelfException(string message, Exception innerException)

            : base(message, innerException)
        {

        }
        /// <summary>
        /// 覆盖Message属性,返回经过处理的异常信息
        /// </summary>
        public override string Message
        {
            get
            {
                return "有异常:" + base.Message;
            }
        }
    }

キャッチとスローのプロセスを見てみましょう:

  public class Exceptions
    {
        public static void PersonInfo(string name, char sex, int age)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            if (sex != &#39;男&#39; && sex != &#39;女&#39;)
            {
                throw new ArgumentException("sex只能为“男”或“女”");
            }

            if (age <= 0 || age >= 150)
            {
                throw new ArgumentOutOfRangeException("age");
            }

            Console.WriteLine(string.Format(@"name={0},sex={1},age={2}", name, sex, age));
        }

        public static void Throwable(bool canThrow, int num)
        {
            if (canThrow)
            {
                throw new MySelfException("测试异常");
            }

            Console.WriteLine(1 / num);

            Console.WriteLine("木有抛出异常");
        }
    }

//Call:

   class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Exceptions.PersonInfo(null, &#39;男&#39;, 22); 

                // Exceptions.PersonInfo("Purple", &#39;呵呵&#39;, 22);

                Exceptions.PersonInfo("Purple", &#39;男&#39;, 1000);

                //Exceptions.PersonInfo("Purple", &#39;男&#39;, 22);

                Console.WriteLine("代码执行无错误");
            }
            catch (ArgumentNullException e)
            {
                Console.WriteLine(e.Message);

                Console.WriteLine(e.StackTrace);
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(e.Message);

                Console.WriteLine(e.StackTrace);
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(e.Message);

                Console.WriteLine(e.StackTrace);
            }

            Console.ReadLine();
        }
    }

それは try で確認できます。コード ブロック (1 回) プログラムが throw キーワードに到達すると、後続のコードの実行を直ちに停止し、実行のために throw 例外オブジェクト タイプに対応する catch コード ブロックにジャンプします。したがって、キャッチ アンド スロー モデルは、例外を処理するためのより直感的で合理的な方法です。

上記は C# の基礎知識をまとめたものです: 基礎知識 (13) 異常なコンテンツ、その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。