社区
C#
帖子详情
c#的try catch 捕捉不到全部异常!!
xwspider
2007-09-29 04:06:01
c#的try catch 捕捉不到全部异常!!
我的代码调用了系统API函数,经常搞的程序崩溃,但try catch 捕捉不到异常
错误提示:尝试读取或写入受保护的内存
郁闷!!!
...全文
2810
10
打赏
收藏
c#的try catch 捕捉不到全部异常!!
c#的try catch 捕捉不到全部异常!! 我的代码调用了系统API函数,经常搞的程序崩溃,但try catch 捕捉不到异常 错误提示:尝试读取或写入受保护的内存 郁闷!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zagj11
2011-01-04
打赏
举报
回复
xue xuexixue xuexixue xuexi
egyqy
2007-09-29
打赏
举报
回复
有的 还得自定义错误啊
xwspider
2007-09-29
打赏
举报
回复
还是不行
tsy_zx
2007-09-29
打赏
举报
回复
是Ctrl+Alt+D+E
王集鹄
2007-09-29
打赏
举报
回复
这类问题一般是访问无效指针造成,检查一下是否开辟了足够的内存空间
try catch不是万能的,写出稳定的代码不是靠try catch,而是靠严谨的逻辑分析
try catch是帮你处理如:访问网络、文件、数据库、端口等外在因素造成的异常
糊涂男人
2007-09-29
打赏
举报
回复
c#的try catch 能捕捉的信息是在.net框架内支持的异常,而调用API出现的异常C#根本就捕获不了,能够提示的就是哪块内存为之读不能修改之类的.个人认为你的程序出错可能是不正确引用API函数造成的,所以TRY根本就try不到
xwspider
2007-09-29
打赏
举报
回复
1
那我应该怎么避免程序崩溃?
真相重于对错
2007-09-29
打赏
举报
回复
.net与api 运行于两个不同的地址空间
无法完全捕获
leonbanana
2007-09-29
打赏
举报
回复
Ctrl+D+E,把里面的选项都打上钩,44
Ivony
2007-09-29
打赏
举报
回复
那个不是异常吧。
【09-
异常
处理】
异常
概述 •
异常
处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++、
C#
、Ruby、 Python等,大都提供了
异常
处理机制。增加了
异常
处理机制后的程序有更好的容错性,更加健壮。 传统错误处理的缺陷 •传统错误处理机制,主要如下两个缺点: –无法穷举所有
异常
情况:因为人类知识的限制,
异常
情况总比可以考虑到的情况多,总有“漏网之鱼”的
异常
情况,所以程序总是不够健壮。 –错误处理代码和业务实现代码混杂:这种错误处理和业务实现混杂的代码严重影响程序的可读性,会增加程序维护的难度。 使用
try
...
cat
ch
捕获
异常
•执行
try
块里的业务逻辑代码时出现
异常
,系统自动生成一个
异常
对象,该
异常
对象被提交给Java运 行时环境,这个过程被称为抛出(throw)
异常
。 •Java运行时环境收到
异常
对象时,会寻找能处理该
异常
对象的
cat
ch
块,如果找到合适的
cat
ch
块并 把该
异常
对象交给该
cat
ch
块处理,那这个过程被称为捕获(
cat
ch
)
异常
;如果Java运行时环境找
不到
捕获
异常
的
cat
ch
块,则运行时环境终止,Java程序也将退出。
异常
的
捕捉
流程 Java的
异常
体系 访问
异常
信息 •如果程序需要在
cat
ch
块中访问
异常
对象的相关信息,可以通过调用
cat
ch
后
异常
形参的方法来获 得。当Java运行时决定调用某个
cat
ch
块来处理该
异常
对象时,会将该
异常
对象赋给
cat
ch
块后的异 常参数,程序就可以通过该参数来获得该
异常
的相关信息。 •所有
异常
对象都包含了如下几个常用方法: –getMessage():返回该
异常
的详细描述字符串。 –printStackTrace():将该
异常
的跟踪栈信息输出到标准错误输出。 –printStackTrace(PrintStream s):将该
异常
的跟踪栈信息输出到指定输出流。 –getStackTrace():返回该
异常
的跟踪栈信息。
异常
处理 复制代码
try
{ 需要检测的代码; }
cat
ch
(
异常
类 变量) {
异常
处理代码; } finally { 一定会执行的代码; } 复制代码 Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0)。 Java 7提供的多
异常
捕捉
•在Java 7以前,每个
cat
ch
块只能
捕捉
一个
异常
。从Java 7开始,一个
cat
ch
块可以
捕捉
多个
异常
。 –
cat
ch
(
异常
1 |
异常
2 |
异常
3 ex) –{ –} •多个
异常
之间用竖线隔开。 •多
异常
捕捉
时,
异常
变量之前有隐式final修饰。 本文原创作者:pipi-
ch
anging 本文原创出处:http://www.cnblogs.com/pipi-
ch
anging/ 使用finally回收资源 •程序在
try
块里打开了一些物理资源(例如数据库连接、网络连接和磁盘文件等),这些物理资源都 必须显式回收。 •为了保证一定能回收
try
块中打开的物理资源,
异常
处理机制提供了finally块。不管
try
块中的代码是 否出现
异常
,也不管哪一个
cat
ch
块被执行,finally块总会被执行。
异常
处理的嵌套 •
异常
处理流程代码可以放在任何能放可执行性代码的地方,因此完整的
异常
处理流程既可放在
try
块 里,也可放在
cat
ch
块里,也可放在finally块里。 •
异常
处理嵌套的深度没有很明确的限制,但通常没有必要使用超过两层的嵌套
异常
处理,层次太深的 嵌套
异常
处理没有太大必要,而且导致程序可读性降低。 Java 7的自动关闭资源的
try
语句 –
try
( – // 此处声明的资源, 系统可以自动关闭它。 –) –{ – // –} •对于自动关闭资源的
try
语句, 可以没有
cat
ch
和finally——
try
块可以孤独地存在。 •自动关闭资源的
try
语句,有两个注意点: –只有放在
try
后面的圆括号里的资源才会被关闭。 –能被自动关闭的资源必须实现Closeable或AutoCloseable接口。
Ch
ecked
异常
与Runtime
异常
•Java的
异常
被分为两大类:
Ch
ecked
异常
和Runtime
异常
(运行时
异常
)。所有 RuntimeException类及其子类的实例被称为Runtime
异常
;不是RuntimeException类及其子类 的
异常
实例则被称为
Ch
ecked
异常
。
Ch
ecked
异常
的处理 •当前方法明确知道如何处理该
异常
,程序应该使用
try
...
cat
ch
块来捕获该
异常
,然后在对应的
cat
ch
块中修改该
异常
。 •当前方法不知道如何处理这种
异常
,应该在定义该方法时声明抛出该
异常
。 Runtime
异常
的处理 •Runtime
异常
则更加灵活,Runtime
异常
无需显式声明抛出。 •如果程序需要
捕捉
Runtime
异常
,也可以使用
try
...
cat
ch
块来
捕捉
Runtime
异常
。 使用throws声明抛出
异常
•throws声明抛出
异常
的思路是:当前方法不知道应该如何这种类型的
异常
,该
异常
应该由上一级调 用者处理,如果main方法也不知道应该如何处理这种类型的
异常
,也可以使用throws声明抛出异 常,该
异常
将交给JVM处理。JVM对
异常
的处理方法是:打印
异常
跟踪栈信息,并中止程序运行,这 就是前面程序在遇到
异常
后自动结束的原因。 •throws声明抛出只能在方法签名中使用,throws可以声明抛出多个
异常
类,多个
异常
类之间以逗 号隔开。throws声明抛出的语法格式如下 –throws ExceptionClass1 , ExceptionClass2... 抛出
异常
•如果需要在程序中自行抛出
异常
,应使用throw语句,throw语句可以单独使用,throw语句抛出 的不是
异常
类,而是一个
异常
实例,而且每次只能抛出一个
异常
实例。throw语句的语法格式如下: –throw ExceptionInstance; •如果throw语句抛出的
异常
是
Ch
ecked
异常
,则该throw语句要么处于
try
块里,显式捕获该
异常
,要么放在一个带throws声明抛出的方法中,即把该
异常
交给该方法的调用者处理。 Java 7增强的throw语句 –
try
–{ – new FileInputStream(“a.txt”); –} –
Cat
ch
(Exception ex) –{ – ex.printStackTrace(); – throw ex; //① –} •从JDK 7开始,Java编译器可以只能地识别①号代码处抛出的
异常
只是FileNotFoundException
异常
。 自定义
异常
类 •程序很少会自行抛出系统
异常
,因为
异常
的类名通常包含了该
异常
的有用信息。所以在选择抛出什么
异常
时,应该选择合适的
异常
类,从而可以明确地描述该
异常
情况。在这种情形下,应用程序常常需要 抛出自定义
异常
。 •用户自定义
异常
都应该继承Exception基类,如果希望自定义Runtime
异常
,则应该继承 RuntimeException基类。定义
异常
类时通常需要提供两种构造器:一个是无参数的构造器;另一个 是带一个字符串参数的构造器,这个字符串将作为该
异常
对象的详细说明(也就是
异常
对象的 getMessage方法的返回值)。
异常
链 •当业务逻辑层访问持久层出现SQLException
异常
时,程序不应该把底层的SQLException
异常
传 到用户界面,原因有如下两个: –对于正常用户而言,他们不想看到底层SQLException,SQLException对他们使用该系统没 有任何帮助。 –对于恶意用户而言,将SQLException暴露出来是一种不安全的。 Java的
异常
跟踪栈 •
异常
对象的printStackTrace方法用于打印
异常
的跟踪栈信息,根据printStackTrace方法的输出 结果,我们可以找到
异常
的源头,并跟踪到
异常
一路触发的过程。 •面向对象的应用程序运行时,经常会发生一系列方法调用,从而形成“方法调用栈”,
异常
的传播则与 相反:只要
异常
没有被完全捕获(包括
异常
没有被捕获,或
异常
被处理后重新抛出了新
异常
),
异常
从 发生
异常
的方法逐渐向外传播,首先传给该方法的调用者,该方法调用者再次传给其调用者……直至最 后传到 main方法,如果main方法依然没有处理该
异常
,JVM会中止该程序,并打印
异常
的跟踪栈信 息。
异常
处理规则 •不要过度使用
异常
•不要使用过于庞大的
try
块 •避免使用
Cat
ch
All语句 •不要忽略捕获到
异常
。。。。。。。。。。。。。
C#
Try
...
Cat
ch
异常
捕捉
机制
1.同步方法中
捕捉
异常
肯定是可以的 2.多线程Task方法中
捕捉
异常
可以
捕捉
异常
的写法: ①Task中使用
try
…
cat
ch
… Task中可能会抛出多个
异常
= ②wait()、Result 在调用Task的Wait()方法或Result属性处会抛出Task中的
异常
。 ③使用ContinueWith捕获
异常
如果不可以在内部捕获,可以使用ContinueWith()方法捕获
异常
var t = Task.Run<int>(() => {
面向对象
C#
初级入门精讲(5)面向对象
面向对象
C#
初级入门精讲视频教程,该课程内容涵盖1、类的继承,包括理解继承的概念、存在继承关系的构造方法执行过程、隐藏基类的方法、装箱与拆箱、sealed关键字的作用2、多态的实现,包括重写父类方法、多态的实现、base关键字、里氏转换原则及Object类3、抽象类与接口的使用4、
异常
的处理方法,包括
try
……
cat
ch
和finally5、理解命名空间的含义6、程序集的意义及其应用7、理解
C#
7.0的9个新特性
关于
try
cat
ch
捕捉
不到
异常
先看下面的代码,思考一下输出:
try
{ throw new Error(3); }
cat
ch
(e) { console.log(e); }
try
{ //
捕捉
不到
...
C#
捕捉
未被
Try
Cat
ch
捕获的
异常
Winform程序中,有
try
…
cat
ch
…进行
异常
捕获,但还是存在
异常
关闭的情况,在程序中捕获这些
异常
,会大大方便问题的定位分析与程序优化。 两个
异常
事件 Appli
cat
ion.ThreadException在发生应用程序UI主线程中未捕获线程
异常
时发生,触发的事件; AppDomain.CurrentDomain.UnhandledException当后台线程中某个
异常
未被捕获时触发;...
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章