我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#System.TypeInitializationException异常处理方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#System.TypeInitializationException异常处理方案

C# System.TypeInitializationException 异常处理

备忘

问题在这

这种错误大多是声明的类里面初始字段赋值出了问题

比如 在类里面生命了一个 太大的数组,超出了最大内存限制就会出错

修改下就OK了

C#基础--错误和异常

异常类

在c#中,当出现某个特殊的异常错误条件时,就会创建(或抛出)一个异常对象。这个对象包含有助于跟踪问 题的信息。我们可以创建自己的异常类,但.NET提供了许多预定义的异常类,多到这里不可能 提供详尽的列表。

列举几个常见异常:

  • StackOverflowException—如果分配给栈的内存区域己满,就会抛出这个异常。
  • EndOfStreamException—这个异常通常是因为读到文件末尾而抛出的。
  • OverflowException—如果要在checked上下文中把包含值-40的int类型数据强制转换为uint数据,就会抛出这个异常。

捕获异常

  • try块包含的代码组成了程序的正常操作部分,但这部分程序可能遇到某些严重的错误。
  • catch块包含的代码处理各种错误情况,这些错误是执行try块中的代码时遇到的。这个块还可以用于记 录错误。
  • finally块包含的代码清理资源或执行通常要在try块或catch块末尾执行的其他操作。无论是否抛出异常,都会执行finally块,理解这一点非常重要。因为finally块包含了应总是执行的清理代码,如果 在finally块中放置了return语句,编译器就会标记一个错误。

下面的步骤说明了这些块是如何组合在一起捕获错误情况的:

(1) 执行的程序流进入try块。

(2) 如果在try块中没有错误发生,在块中就会正常执行操作。当程序流到达try块末尾后,如果存在一个finally块,程序流就会自动SA finally块(第(5)步)。但如果在try块中程序流检测到一个错误,程序流就会跳转 到catch块(第⑶步)。

(3) 在catch块中处理错误。

(4) 在catch块执行完后,如果存在一个finally块,程序流就会自动进入finally块:

(5) 执行finally块(如果存在)。

try
{
    
}
catch (Exception ex)
{
    
}
finally
{
    
}

异常性能

异常处理具有性能含义。在常见的情况下,不应该使用异常处理错误。例如,将字符串转换为数字时,可 以使用int类型的Paree方法。如果传递给此方法的字符串不能转换为数字,此方法抛FormatException异常;如果可以转换一个数字,但它不能放在int类型中,则抛出OverflowException异常:

static void NumberDemol(string n)
{
    if (n is null) throw new ArgumentNullException(nameof(n)); 
    try
    {
        int i = int.Parse(n);
        Console.WriteLine($"converted: {i}");
    }
    catch (FormatException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (OverflowException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

如果NumberDemol方法通常只用于在字符串中传递数字而接收不到数字是异常的,那么可以这样编写它。 但是,如果在程序流的正常情况下,期望的字符串不能转换时,可以使用TryParse方法。如果字符串不能转换 为数字,此方法不会抛出异常。相反,如果解析成功,TryParse返回true;如果解析失败,则返回felse:

static void NumberDemo2(string n)
{
    if (n is null) throw new ArgumentNullException(nameof(n)); 
    if (int.TryParse(n,   out int result))
    {
        Console. WriteLine ($"converted {result}");
    }
    else
    {
        Console.WriteLine("not a number");
    }
}

实现多个catch块

class Program
{
    static void Main()
    {
        while (true)
        {
            try
            {
                string userInput;

                Console.Write("Input a number between 0 and 5 or just hit return to exit)> ");
                userInput = Console.ReadLine();

                if (string.IsNullOrEmpty(userInput))
                {
                    break;
                }

                int index = Convert.ToInt32(userInput);

                if (index < 0 || index > 5)
                {
                    throw new IndexOutOfRangeException($"You typed in {userInput}");
                }

                Console.WriteLine($"Your number was {index}");
            }
            catch (IndexOutOfRangeException ex)
            {
                Console.WriteLine($"Exception: Number should be between 0 and 5. {ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"An exception was thrown. Message was: {ex.Message}");
            }
            finally
            {
                Console.WriteLine("Thank you\n");
            }
        }
    }
}

异常过滤器

自从C# 6开始就支持异常过滤器。catck块仅在过滤器返回true时执行。捕获不同的异常类型时,可以有行为不同的catch块。在某些情况下,catch块基于异常的内容执行不同的操作。

class Program
{
    static void Main()
    {
        try
        {
            ThrowWithErrorCode(405);

        }
        catch (MyCustomException ex) when (ex.ErrorCode == 405)
        {
            Console.WriteLine($"Exception caught with filter {ex.Message} and {ex.ErrorCode}");
        }
        catch (MyCustomException ex)
        {
            Console.WriteLine($"Exception caught {ex.Message} and {ex.ErrorCode}");
        }

        Console.ReadLine();
    }

    public static void ThrowWithErrorCode(int code)
    {
        throw new MyCustomException("Error in Foo") { ErrorCode = code };
    }
}

自定义异常

这个示例称为SolicitColdCall,它包 含两个嵌套的try块,说明了如何定义自定义异常类,再从try块中抛出另一个异常。

public class ColdCallFileFormatException : Exception
{
    public ColdCallFileFormatException(string message)
        : base(message)
    {
    }

    public ColdCallFileFormatException(string message, Exception innerException)
        : base(message, innerException)
    {
    }
}

public class SalesSpyFoundException : Exception
{
    public SalesSpyFoundException(string spyName)
      : base($"Sales spy found, with name {spyName}")
    {
    }

    public SalesSpyFoundException(string spyName, Exception innerException)
      : base($"Sales spy found with name {spyName}", innerException)
    {
    }
}

public class UnexpectedException : Exception
{
    public UnexpectedException(string message)
        : base(message)
    {
    }

    public UnexpectedException(string message, Exception innerException)
        : base(message, innerException)
    {
    }
}

public class ColdCallFileReader : IDisposable
{
    private FileStream _fs;
    private StreamReader _sr;
    private uint _nPeopleToRing;
    private bool _isDisposed = false;
    private bool _isOpen = false;

    public void Open(string fileName)
    {
        if (_isDisposed)
        {
            throw new ObjectDisposedException("peopleToRing");
        }

        _fs = new FileStream(fileName, FileMode.Open);
        _sr = new StreamReader(_fs);

        try
        {
            string firstLine = _sr.ReadLine();
            _nPeopleToRing = uint.Parse(firstLine);
            _isOpen = true;
        }
        catch (FormatException ex)
        {
            throw new ColdCallFileFormatException(
                $"First line isn\'t an integer {ex}");
        }
    }

    public void ProcessNextPerson()
    {
        if (_isDisposed)
        {
            throw new ObjectDisposedException("peopleToRing");
        }

        if (!_isOpen)
        {
            throw new UnexpectedException(
                "Attempted to access coldcall file that is not open");
        }

        try
        {
            string name = _sr.ReadLine();
            if (name == null)
            {
                throw new ColdCallFileFormatException("Not enough names");
            }
            if (name[0] == 'B')
            {
                throw new SalesSpyFoundException(name);
            }
            Console.WriteLine(name);
        }
        catch (SalesSpyFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
        }
    }

    public uint NPeopleToRing
    {
        get
        {
            if (_isDisposed)
            {
                throw new ObjectDisposedException("peopleToRing");
            }

            if (!_isOpen)
            {
                throw new UnexpectedException(
                    "Attempted to access cold–call file that is not open");
            }

            return _nPeopleToRing;
        }
    }

    public void Dispose()
    {
        if (_isDisposed)
        {
            return;
        }

        _isDisposed = true;
        _isOpen = false;

        _fs?.Dispose();
        _fs = null;
    }
}

class Program
{
    static void Main()
    {
        Console.Write("Please type in the name of the file " +
            "containing the names of the people to be cold called > ");
        string fileName = Console.ReadLine();
        ColdCallFileReaderLoop1(fileName);
        Console.WriteLine();
        ColdCallFileReaderLoop2(fileName);
        Console.WriteLine();

        Console.ReadLine();
    }

    private static void ColdCallFileReaderLoop2(string fileName)
    {
        using (var peopleToRing = new ColdCallFileReader())
        {

            try
            {
                peopleToRing.Open(fileName);
                for (int i = 0; i < peopleToRing.NPeopleToRing; i++)
                {
                    peopleToRing.ProcessNextPerson();
                }
                Console.WriteLine("All callers processed correctly");
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine($"The file {fileName} does not exist");
            }
            catch (ColdCallFileFormatException ex)
            {
                Console.WriteLine($"The file {fileName} appears to have been corrupted");
                Console.WriteLine($"Details of problem are: {ex.Message}");
                if (ex.InnerException != null)
                {
                    Console.WriteLine($"Inner exception was: {ex.InnerException.Message}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception occurred:\n{ex.Message}");
            }
        }
    }

    public static void ColdCallFileReaderLoop1(string fileName)
    {
        var peopleToRing = new ColdCallFileReader();

        try
        {
            peopleToRing.Open(fileName);
            for (int i = 0; i < peopleToRing.NPeopleToRing; i++)
            {
                peopleToRing.ProcessNextPerson();
            }
            Console.WriteLine("All callers processed correctly");
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine($"The file {fileName} does not exist");
        }
        catch (ColdCallFileFormatException ex)
        {
            Console.WriteLine($"The file {fileName} appears to have been corrupted");
            Console.WriteLine($"Details of problem are: {ex.Message}");
            if (ex.InnerException != null)
            {
                Console.WriteLine($"Inner exception was: {ex.InnerException.Message}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Exception occurred:\n{ex.Message}");
        }
        finally
        {
            peopleToRing.Dispose();
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#System.TypeInitializationException异常处理方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#System.TypeInitializationException异常处理方案

这篇文章主要介绍了C#System.TypeInitializationException异常处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-26

C# System.TypeInitializationException异常如何处理

这篇文章主要介绍“C# System.TypeInitializationException异常如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C# System.TypeInitializa
2023-07-05

C++ 函数中异常处理的替代方案是什么?

在 c++++ 中,异常处理的替代方案提供了处理错误的多种选择:错误码:使用预定义的代码表示错误情况,便于检查错误类型。返回空值:使用空值(如 nullptr)表示错误,通过检查返回值判别错误。枚举类型:定义错误类型的枚举,通过比较返回的代
C++ 函数中异常处理的替代方案是什么?
2024-04-23

C#异常怎么处理

这篇文章主要讲解了“C#异常怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异常怎么处理”吧!异常是程序运行中发生的错误,C#异常处理是程序设计的一部分。在C#异常处理是通过Exc
2023-06-17

c++异常处理的方法有哪些

在C++中,有以下几种异常处理的方法:1. try-catch语句块:使用try-catch语句块可以捕获和处理异常。在try块中编写可能会引发异常的代码,然后在catch块中捕获并处理这些异常。可以使用多个catch块来处理不同类型的异常
2023-10-10

C#处理异常的方式有哪些

本篇内容主要讲解“C#处理异常的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#处理异常的方式有哪些”吧!关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子
2023-06-22

C++ 异常处理 catch(...)介绍

catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常 对象更好的控制手段,使开发的软件系统有很好的可靠性
2022-11-15

C#中怎么处理异常

在C#中,可以使用try-catch语句来处理异常。try块中包含可能会抛出异常的代码,而catch块中包含处理异常的代码。示例代码如下:try{// 可能会抛出异常的代码int x = 10;int y = 0;int result
C#中怎么处理异常
2024-04-03

C#中处理异常的方法是什么

在C#中处理异常的方法可以使用try-catch语句块。在try块中编写可能抛出异常的代码,然后在catch块中捕获并处理这些异常。例如:try{// 可能抛出异常的代码}catch (Exception ex){// 处理异常的
C#中处理异常的方法是什么
2024-03-06

C++ 函数异常与类异常:多重异常处理策略

c++++ 异常处理分为函数异常和类异常两种。多重异常处理策略包括逐一处理和捕获基类两种。实战中,可以使用异常处理策略处理不同来源的异常,根据异常类型打印不同的错误消息。C++ 函数异常与类异常:多重异常处理策略概述异常处理是 C++
C++ 函数异常与类异常:多重异常处理策略
2024-05-03

【C#基础】C# 异常处理操作

序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程 文章目录 前言1,异常的概念2,处理异常3,自定义异常4,编译器异常结语 前言 🌷大家好,我是wr
2023-08-18

C++中常见的异常处理问题解决方法

C++中常见的异常处理问题解决方法,需要具体代码示例引言:在编写C++程序时,时常会遇到程序出现异常的情况,如除数为0、数组越界、空指针访问等等。这些异常会导致程序的崩溃或者产生不可预测的结果,为了增强程序的稳定性和可靠性,我们需要使用异常
2023-10-22

异常--python异常处理

--****--python 异常处理------------------------------------------------------------------------------****DB API中定义了一些数据库操作的错
2023-01-31

C++ 函数的异常处理和异常说明符

异常处理处理运行时错误,包括抛出、捕获和处理异常。异常说明符用于指定函数可以抛出的异常类型,包括 noexcept(expr)(指定不抛出异常)和 throw()(指定可以抛出任何类型异常)。实战案例中,print_file 函数使用 th
C++ 函数的异常处理和异常说明符
2024-04-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录