例如Scala错误堆栈问题,怎么解决

例如Scala错误堆栈问题,怎么解决,第1张

scala的异常处理机制和java类似。

异常处理是一个很大的话题,这里我们主要介绍scala处理异常的特别之处。

我们先看下scala是如何抛出异常的:

throw new IllegalArgumentException("arg 1 was wrong...")

上面的语法和java中的抛出异常语法完全一致。

当异常被抛出之后,程序语句的正常执行就被中誉雹断了,异常被沿着程序执行的堆栈一层层传到了上一级,直到异常被捕获。

我们看下scala如何捕获异常:

try{ throwsException()println("this line is never executed")} catch { case e: Exception =>println("exception caught: " + e)} //A METHOD THAT THROWS EXCEPTION def throwsException() { throw new IllegalStateException("Exception thrown")}

scala的try..catch语句和java的有些不一样了,catch语句中通过case语句来捕获对应的异常,注意case语句的语法。

在上面的例子中只有一个case语句,而实际上scala支持多个case语句,和java中类似异常类型越泛应该写在越靠后的位粗伏置。

catch { case e: IllegalArgumentException =>println("illegal arg. exception") case e: IllegalStateException=>println("illegal state exception") case e: IOException =>println("IO exception")}

scala的finally语句

finally和java中的finally语句是一样的,无论是否会抛出异常都会执岩虚携行finally语句块内的内容,如下是一个finally语句块:

try { throwsException()} finally { println("this code is always executed")}

finally语句也可以放在try..catch的后面,如果异常发生时,可以执行catch语句之后再执行finally语句块内的内容。

try { throwsException()} catch { case e: IllegalArgumentException =>println("illegal arg. exception") case e: IllegalStateException=>println("illegal state exception") case e: IOException =>println("IO exception")} finally { println("this code is always executed")}

try 语句可为一组语句指定异常处理器和/或清理代码:

子句指定一个或多个异常处理程序。 当 try 子句中没有和冲则发生异常时,没有任何异常处理程序会被执行。 当 try 子句中发生异常时,将启动对异常处理程序的搜索。 此搜索会逐一检查 except 子句直至找到与该异常相匹配的子句。 如果存在无表达式的 except 子句,它必须是最后一个;它将匹配任何异常。 对于带有表达式的 except 子句,该表达式会被求值,如果结果对象与发生的异常“兼容”则该子句将匹配该异常。 如果一个对象是唤棚异常对象所属的类或基类,或者是包含兼容该异常的项的元组则两者就是兼容的。

如果没有 except 子句与异常相匹配,则会在周边代码和发起调用栈上继续搜索异常处理器。 1

如果在对 except 子句头中的表达式求值时引发了异常,则原来对处理器的搜索会被取消,并在周边代码和调用栈上启动对新异常的搜索(它会被视作是整个 try 语句所引发的异常)。

当找到一个匹配的 except 子句时,该异常将被赋值给该 except 子句在 as 关键字之后指定的目标,如果存在此关键字的话,并且该 except 子句体将被执行。 所有 except 子句都必须有可执行的子句体。 当到达子句体的末尾时,通常会转向整个 try 语句之后继续执行。 (这意味着如果对于同一异常存在有嵌套的两个处理器,而异常发生于内层处理器的 try 子句中,则外层处理器将不会处理该异常。)

当使用 as 将目标赋值为一个异常时,它将在 except 子句结束时被清除。 这就相当于

这意味着异常必须赋值给一个不同的名称才能在 except 子句之后引用它。 异常会被清除是因为在附加了回溯信息的情况下,它们会形成堆栈帧的循环引用,使得所有局部变量保持存活直到发生下一次垃圾回收。

函数的返回值是由最后被执行的 return 语句所决定的。 由于 finally 子句总是被执行,因此在 finally 子句中被执行的 return 语句总是最后判销被执行的:

C++里这个异常是怎么回事?怎么解决?1.先下载系统动态链修复并凳的专用工具,注意不同的 *** 作系统有不同的版本。

2.如果是Windows XP *** 作系统,那么还有必要先安装Microsoft .NET Framework 2.0或更高版本才可运行本程序,否则会出错。

3.点击:检测并修复。 登录

ShaYQ

关注

C++程序异常时怎么处理 原创

2020-03-27 10:48:21

ShaYQ

码龄8年

关注

程序崩溃定位以及准备

如何定位程序异常

1. 文档说明

主要是针对Windows下的程序崩溃异常,以下是结合实际经验以及借鉴网上的参考,得出的小结,具有一定实际意义。

2. 分析说明

程序运行时异常崩溃无法避免,需要快速定位以下几个情况:

1.必现的崩溃异常,直接用VS进行调试运行,加断点调试,崩溃时ALT+2查看堆栈。

2.对于实际运行中的异常,不好直接定位,需要我们结合实际情况提前做好准备和分析。

3. 解决思路

主要针对绝枣旅第2种情况比较复杂,参考以下,在《Windows核心编程》中有部分参考:

1. 崩溃时,添加回调函数,来进入具体的异常处理代码段;

2. 在注册的回调函数中,输出崩溃的详细信息(堆栈信息等);

3. 结合工程输出的MAP文件,参考内存地址找到崩溃的函数;

4. 具体 *** 作

4.1 注册异常处理函数

用SetUnhandledExceptionFilter注册自定义的错误处理回调函数,打印出崩溃时候的异常堆栈信息。

可以参考网络教程;

4.2 输出崩岩做溃信息

4.2.1 回调函数原型:

typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(

__in struct _EXCEPTION_POINTERS *ExceptionInfo

)

返回值:EXCEPTION_CONTINUE_EXECUTION – 错误已经被修复,从异常发生处继续执行

EXCEPTION_CONTINUE_SEARCH – 继续查找异常过滤器

EXCEPTION_EXECUTE_HANDLER – 正常返回

参数: 崩溃信息结构,包含崩溃原因、崩溃模块、崩溃地址、崩溃堆栈等;


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12209967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存