在C#中捕获内存不足异常
作者:conan 发布时间:2021-07-14 11:50:46
标签:C#,捕获,内存,异常
当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException
。System.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);
来源:https://mp.weixin.qq.com/s?__biz=Mzg3ODAxNzM5OQ==&mid=2247493678&idx=1&sn=0edf9083eb1326d6a86e52ef454fe9d3&utm_source=tuicool&utm_medium=referral
0
投稿
猜你喜欢
- 内置的连接池目前spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池。 数据库连接可以使
- 使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2
- 一、原因:forceclose,意为强行关闭,当前应用程序发生了冲突。NullPointExection(空指针),IndexOutOfBo
- 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,
- 本文实例为大家分享TextBox和PasswordBox加水印的方法,供大家参考,具体内容如下Textbox加水印Textbox加水印,需要
- 本文实例讲述了Android编程中context及全局变量的用法。分享给大家供大家参考,具体如下:今天在研究context的时候,对appl
- 本文实例讲述了Java Base64算法实际应用之邮件发送。分享给大家供大家参考,具体如下:一 利用telnet和Base64来实现收发邮件
- Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下开发工具:Andorid Studio 1.3运行环境:
- 1.C++中的时间:(1) time_t其实是一个64位的long int类型(2) time函数:函数简介:函数名: time
- 这里使用Spring Boot 2.7.4版本,对应Spring Security 5.7.3版本本文样例代码地址: spring-secu
- @PathVariable和@RequestParam传参为空@RestControllerpublic class UserControl
- sidebarDepth: 3条件构造器说明以下出现的第一个入参boolean condition表示该条件是否加入最后生成的SQL中,例如
- Unity中的PostProcessBuild:深入解析与实用案例在Unity游戏开发中,我们经常需要在构建完成后对生成的应用程序进行一些额
- java 定时任务在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面
- synchronized关键字,一般称之为”同步锁“,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。同步锁锁的是同一
- 背景客户使用我们系统的时候,查询不带任何查询条件,查询就返回全部数据,500多万条数据啊,然后直接导出,数据量庞大,接口超时,这可苦了我们这
- 前言上一篇小结了一下关于redis的异常测试,今天再来盘一盘 MQ 相关的。MQ 跟 redis 一样,也是现在系统服务中不可或缺的重要中间
- 关于logback日志的详解见这位仁兄的博客:Spring Boot-日志配置(超详细)我在这就开门见山直接介绍我们项目日志的配置使用吧!~
- 1. 前言无论是自我学习中,还是在工作中,固然会遇到与前端搭配实现分页的功能,发现有几种方式,特此记录一下。2. 先说结论分页功能直接交给前
- 上一篇介绍了使用springmvc集成shiro登陆过程,通过FormAuthenticationFilter过滤器获取到用户输入的账号密码