返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >在C#中捕获内存不足异常
  • 198
分享到

在C#中捕获内存不足异常

2024-04-02 19:04:59 198人浏览 八月长安
摘要

当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException。System.OutOfMemoryException继承自System.System

当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryExceptionSystem.OutOfMemoryException继承自System.SystemException类。OutOfMemoryException使用COR_E_OUTOFMEMORY值为 0x8007000E的 HRESULT 。

一个OutOfMemoryException异常异常主要有两个原因:

我们试图将StringBuilder对象扩展到超出其StringBuilder.MaxCapacity属性定义的长度。

公共语言运行时无法分配足够的连续内存来成功执行操作。任何需要分配内存的属性分配或方法调用都可能引发此异常。

设置字符串-


string StudentName = "Tom";
string StudentSubject = "Maths";


现在您需要使用分配的容量进行初始化,该容量是初始值的长度-


StringBuilder sBuilder = new StringBuilder(StudentName.Length, StudentName.Length);


现在,如果您尝试插入其他值,则会发生异常。


sBuilder.Insert(value: StudentSubject, index: StudentName.Length - 1, count: 1);


发生以下异常-


System.OutOfMemoryException: Out of memory


要捕获错误,请尝试以下代码-

示例:


 try
            {
                
                string videoSaveDir = CommonHelper.GetVideoDirectory();
                int setCount = 0;
                #region 模拟抛出OutOfMemoryException用
                //List<VideoExtend> dataSource = new List<VideoExtend>();
                //dataSource.Add(new VideoExtend() {  EHost="Http://www.baidu.com",FileName="BAI.mp4"});
                #endregion
                
                if (dataSource != null)
                {
                    totalCount = dataSource.Count;
                }
                foreach (VideoExtend video in dataSource)
                {
                    try
                    {
                        setCount++;
                        string fileName = video.FileName;
                        string fileFullPath = videoSaveDir + fileName;
                        if (File.Exists(fileFullPath))
                        {
                            if (!JudgeFileStatus(fileFullPath, fileName))
                            {
                                continue;
                            }
                            string strFileSize = "";
                            if (!FileCanUpload(fileFullPath, out strFileSize))
                            {
                                //数据库更新为上传失败,文件太大
                                if (monGoData == null)
                                {
                                    apiHelper.UpdateUploadToQiniuFileTooLarge(video.EHost);
                                }
                                else
                                {
                                    mongoData.UpdateUploadToQiniuFileTooLarge(video.EHost);

                                }
                                LogHelper.Log(LogFilePrefix+"uploadFileTooLarge", "文件" + fileName + "太大,大小为:" + strFileSize);
                                continue;
                            }
                            LogHelper.Log(LogFilePrefix + "uploadInfo", "开始上传" + setCount + "/" + totalCount + "文件:" + video.FileName);
                            string newFileName = "";
                            bool updateStatus = QiniuUtil.Upload(fileFullPath, out newFileName);
                            if (updateStatus)
                            {
                                if (mongoData == null)
                                {
                                    apiHelper.UpdateUploadToQiniuSuccessStatus(video.EHost, newFileName);
                                }
                                else
                                {
                                    mongoData.UpdateUploadToQiniuSuccessStatus(video.EHost, newFileName);//更新数据库
                                }

                                LogHelper.Log(LogFilePrefix + "uploadsuccess", "上传成功,源文件名:" + video.FileName + ";新文件名:" + newFileName);
                                if (JudgeFileStatus(fileFullPath, fileName))
                                {
                                    try
                                    {
                                        File.Delete(fileFullPath);
                                    }
                                    catch (Exception ex) { }
                                }
                                setCount++;
                            }
                        }
                        else
                        {
                            //把数据库重置为要重新下载
                            if (mongoData == null)
                            {
                                apiHelper.UpdateUploadToQiniuLocalFileNotFound(video.EHost);
                            }
                            else
                            {
                                mongoData.UpdateUploadToQiniuLocalFileNotFound(video.EHost);

                            }
                            LogHelper.Log(LogFilePrefix + "uploadNoExisted", "文件不存在:" + fileName);
                            //throw new System.OutOfMemoryException();//模拟抛出OutOfMemoryException用
                        }
                    }
                    catch (System.OutOfMemoryException memoryEx)
                    {
                        Global.IsOutOfMemoryException = true;
                        LogHelper.LogWithLock(LogFilePrefix + "uploadOutOfMemoryException", "失败,文件名" + video.FileName + ",异常信息:" + memoryEx.Message + ";内部错误" + memoryEx.InnerException?.Message);
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Log(LogFilePrefix + "uploadError", "失败,文件名" + video.FileName + ",异常信息:" + ex.Message + ";内部错误" + ex.InnerException.Message);
                    }
                    System.Threading.Thread.Sleep(5 * 1000);//休眠
                }
                if (setCount <= 0)
                {
                    LogHelper.Log(LogFilePrefix + "uploadInfo", "暂无新待上传数据");
                }
                int sleepSecond = 30;
                LogHelper.Log(LogFilePrefix + "uploadInfo", "--休眠" + sleepSecond + "秒");
                System.Threading.Thread.Sleep(sleepSecond * 1000);//休眠
            }
            catch (Exception ex)
            {
                LogHelper.Log(LogFilePrefix + "uploadfullerror", "失败,异常信息:" + ex.Message+ ";totalCount="+ totalCount);
            }

上面处理OutOfMemoryException并生成以下错误-

输出结果

Error:


    Global.IsOutOfMemoryException = true;
                        LogHelper.LogWithLock(LogFilePrefix + "uploadOutOfMemoryException", "失败,文件名" + video.FileName + ",异常信息:" + memoryEx.Message + ";内部错误" + memoryEx.InnerException?.Message);

到此这篇关于在C#中捕获内存不足异常的文章就介绍到这了,更多相关C#捕获内存异常内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在C#中捕获内存不足异常

本文链接: https://lsjlt.com/news/160948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在C#中捕获内存不足异常
    当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException。System.OutOfMemoryException继承自System.System...
    99+
    2024-04-02
  • 如何在Java中捕获异常
    今天就跟大家聊聊有关如何在Java中捕获异常,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2....
    99+
    2023-06-14
  • Python编程中如何捕获警告ps不是捕获异常
    目录1.警告不是异常2.警告能捕获吗3.捕获警告方法一4.捕获警告方法二5.捕获警告方法三1. 警告不是异常 你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也...
    99+
    2024-04-02
  • SqlServer中存储过程如何捕获异常
    这期内容当中小编将会给大家带来有关SqlServer中存储过程如何捕获异常,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  SqlServer中的存储过程怎么捕获异常  ...
    99+
    2024-04-02
  • .net MemoryStream用法导致内存不足异常
    在使用 .NET 的 MemoryStream 类时,可能会遇到内存不足异常的问题。下面是一些导致该异常的常见问题和可能的解决方法:...
    99+
    2023-09-16
    .net
  • .net – MemoryStream用法导致内存不足异常
    在使用 .NET 的 MemoryStream 类时,如果使用不当,可能会导致内存不足异常。下面是一些可能导致内存不足异常的常见问题...
    99+
    2023-09-17
    .net
  • C++中的异常抛出和捕获方式
    目录C++ 中的异常语法抛出类型声明栈自旋在 C 语言中,如果发生错误,上级函数要进行出错处理,层层上传,容易造成过多的出错处理代码,并且传递的效率比较低下。 C++ 中的异常 C+...
    99+
    2024-04-02
  • 讨论php在捕获异常方面存在一些问题
    PHP是一种开源的脚本语言,被广泛用于开发Web应用程序。PHP具有灵活的语法、易于学习和使用以及强大的扩展性、高效性等特点,深受开发者的青睐。但是,PHP也存在一些问题,在开发过程中需要注意。其中之一就是PHP在捕获异常方面存在一些问题。...
    99+
    2023-05-14
    捕获异常 php
  • php在捕获异常方面存在的问题有哪些
    本篇内容主要讲解“php在捕获异常方面存在的问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php在捕获异常方面存在的问题有哪些”吧!一、PHP异常概述异常是指一种程序执行错误或者运行时...
    99+
    2023-07-05
  • c++捕获异常的方法是什么
    在C++中,可以使用try-catch块来捕获异常。试图在try块中执行代码,如果发生异常,则会立即跳转到与异常类型匹配的catch...
    99+
    2023-09-14
    c++
  • python怎样在一行中捕获多个异常
    所属网站分类: python基础 > 异常处理 作者:浮沉 链接:http://www.pythonheidong.com/blog/article/71/ 来源:python黑洞网,专注python资源,python教程,...
    99+
    2023-01-31
    多个 异常 python
  • C++ 函数异常处理中如何捕获特定类型的异常?
    c++++ 中捕获特定类型异常的方法:使用 try-catch 块。在 catch 子句中指定要捕获的异常类型,如 catch (const std::runtime_error&...
    99+
    2024-04-15
    异常处理 特定类型异常 c++
  • python中异常捕获方法详解
    在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办,try-except这个功能其实很多入门书...
    99+
    2022-06-04
    详解 异常 方法
  • python中怎么捕获多个异常
    这篇文章给大家介绍python中怎么捕获多个异常,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、规则说明(1)执行try下的句子,如果引起异常,执行过程会跳到第一个except语句。(2)如果首个except中定义的...
    99+
    2023-06-15
  • c#中nmodbus如何捕捉异常
    在C#中,可以使用try-catch语句块来捕捉Modbus通信中的异常。以下是一个示例代码,演示如何捕捉Modbus异常: usi...
    99+
    2024-04-02
  • 异常处理:PHP中如何捕获和处理异常?
    异常处理:PHP中如何捕获和处理异常?在PHP开发中,异常处理是非常重要的一环。当程序发生意外情况或错误时,我们需要通过捕获和处理异常来保证程序的正常运行。PHP中提供了一套异常处理的机制,本文将介绍如何在PHP中捕获和处理异常,并提供具体...
    99+
    2023-12-18
    捕获 处理 异常
  • C++无try-catch的异常捕获示例详解
    目录try-catch没有try-catch的日子goto 是什么?不同函数之间跳转setjmp 和 longjmpsetjmplongjmp例子无try-catch的异常捕获try...
    99+
    2022-12-08
    C++无try-catch异常捕获 C++ 异常捕获
  • python线程捕获不到异常如何解决
    Python线程捕获不到异常的原因是因为线程中的异常默认是不会被抛出到主线程的。 解决这个问题,可以使用try/except语句在线...
    99+
    2023-10-27
    python
  • 怎么在python中使用try-except方法捕获异常
    这篇文章给大家介绍怎么在python中使用try-except方法捕获异常,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;...
    99+
    2023-06-14
  • 如何在 PHP 中捕获和处理自定义异常?
    在 php 中捕获和处理自定义异常的方法:继承 exception 类创建自定义异常。使用 throw 关键字抛出自定义异常。使用 try、catch 和 finally 块捕获和处理异...
    99+
    2024-05-09
    php 自定义异常
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作