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

 更新时间:2021年12月27日 10:21:47   作者:conan  
这篇文章主要介绍了在C#中捕获内存不足异常,下面文章内容围绕如何在C#中捕获内存不足异常的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助

当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#捕获内存异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解C# 装箱和拆箱(整理篇)

    深入理解C# 装箱和拆箱(整理篇)

    通过装箱和拆箱操作,能够在值类型和引用类型中架起一做桥梁.换言之,可以轻松的实现值类型与引用类型的互相转换
    2017-08-08
  • C#实现简单的计算器功能

    C#实现简单的计算器功能

    这篇文章主要为大家详细介绍了C#实现简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Unity实现游戏伤害数字显示HUD的方法

    Unity实现游戏伤害数字显示HUD的方法

    游戏中收到伤害掉血,会有飘动的伤害数值,本文主要介绍Unity实现游戏伤害数字显示HUD的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C#中ftp检测目录是否存在和创建文件夹的实现

    C#中ftp检测目录是否存在和创建文件夹的实现

    本文主要介绍了C#中ftp检测目录是否存在和创建文件夹的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#实现截图帮助类

    C#实现截图帮助类

    这篇文章介绍了C#实现截图帮助类的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • winform绑定快捷键的方法

    winform绑定快捷键的方法

    这篇文章主要介绍了winform绑定快捷键的方法,涉及WinForm设置窗体按键事件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C#编写的Base64加密和解密类

    C#编写的Base64加密和解密类

    本文给大家汇总介绍了几种C#编写的Base64加密和解密类的代码,从简单到复杂,都能够实现功能,有需要的小伙伴根据自己的项目需求参考下吧。
    2015-05-05
  • C#多线程系列之async和await用法详解

    C#多线程系列之async和await用法详解

    本文详细讲解了C#多线程中async和await的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#处理XML文件的示例详解

    C#处理XML文件的示例详解

    XML是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的,本文主要介绍了C#处理XML文件的相关知识,有需要的小伙伴可以了解一下
    2024-11-11
  • C#8.0新语法using declaration

    C#8.0新语法using declaration

    这篇文章介绍了C#8.0的新语法using declaration,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论