Exit和Abort有什么区别 ( 积分: 20 )

  • 主题发起人 主题发起人 翁富大
  • 开始时间 开始时间

翁富大

Unregistered / Unconfirmed
GUEST, unregistred user!
大虾们,Exit和Abort有什么区别,我看了帮助没看懂也哉,一点小分,不成敬意
 
大虾们,Exit和Abort有什么区别,我看了帮助没看懂也哉,一点小分,不成敬意
 
Use Abort to escape from an execution path without reporting an error.
The Exit procedure immediately passes control away from the current procedure. If the current procedure is the main program, Exit causes the program to terminate.

Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called.
 
Abort应该是抛出异常,最终应该是调用RaiseException这个API
 
abrot 会触发异常,不会执行abort后面的代码,但是如果用finally或except会捕捉到这个异常
exit 会退出整个过程,不会有异常被触发
 
Abort 中止当前正在执行的过程,即该过程或函数失效,而Exit 只是结束该过程或函数。
Abort和Exit的区别在类的继承关系中区别很明显。
Exit仅结束该过程或函数,如果其有继承关系时,还将继续运行子类的部分代码,但是Abort将中止当前正在执行的过程,程序将弹出所有堆栈,程序将不运行任何其他的代码。
 
這個問題好象以前都有人提出過.:)
 
abort: 表示程序在执行路径上立即停止执行,从所有堆栈中退出
Exit: 表示退出该过程或函数,例如:A过程调用B过程,在B过程中遇到Exit时,将会从B过程中退出(仅仅退出当前堆栈B),继续执行A过程
楼上的dwf3110说的就是对的
 
Crazyz, 说的也没错
结合 汪向阳,dwf3110 的说法
 
加深了理解,多谢各位。
 
接受答案了
 
一点建议, 不要把眼光只局限于语法方面或者文档的定义, 可以看看它的代码, 实际上, Abort()最终就是调用RaiseException()来引起软件异常, 然后Delphi的SEH处理代码对此作了特殊处理, 不弹出出错对话框, 下面是与此相关的少量代码, 俺随手写的, 欢迎指正!

// 自定义异常编码
const
LeaveException = $20000000;

// 扩展了的SEH节
type
PEstablisherFrame = ^TEstablisherFrame;
TEstablisherFrame = record
Prev: PEstablisherFrame;
Handler: Pointer;
SafeEip: DWORD; // 出错跳转地址
end;

// 异常回调返回值
type
TExceptionDisposition = DWORD;
const
ExceptionContinueExecution = 0;
ExceptionContinueSearch = 1;
ExceptionNestedException = 2;
ExceptionCollidedUnwind = 3;

// 线程异常回调
function ExceptHandler(var ExceptionRecord: TExceptionRecord; var EstablisherFrame: TEstablisherFrame;
var ContextRecord: TContext; DispatcherContext: Pointer): TExceptionDisposition; cdecl;
begin
if (ExceptionRecord.ExceptionCode = LeaveException) then
begin
ContextRecord.Eip := EstablisherFrame.SafeEip; // 跳到后面
ContextRecord.Esp := DWORD(@EstablisherFrame); // 恢复栈顶
Result := ExceptionContinueExecution; // 已经处理, 线程按ContextRecord继续执行
end else
Result := ExceptionContinueSearch; // 没有处理, 系统继续"询问"后面的SEH节点
end;

// 在调用线程引发一个软件异常
procedure _leave();
begin
RaiseException(LeaveException, 0, 0, nil)
end;

procedure TForm1.Button1Click(Sender: TObject);
asm
// 入口代码(保护现场)
PUSH EBP
PUSH EBX
PUSH ESI
PUSH EDI

// 异常保护( try )
PUSH OFFSET @@SafeEip // TEstablisherFrame.SafeEip := @@SafeEip;
PUSH OFFSET ExceptHandler // TEstablisherFrame.Handler := @ExceptHandler;
PUSH FS:[0] // TEstablisherFrame.Prev := TEB.ExceptionList;
MOV FS:[0], ESP // TEB.ExceptionList := @TEstablisherFrame;

// 弹出异常
CALL _leave

// 去除保护( except )
@@SafeEip:
POP FS:[0] // TEB.ExceptionList := TEstablisherFrame.Prev;
ADD ESP, TYPE Pointer * 2 // 恢复栈顶

// 出口代码(恢复现场)
POP EDI
POP ESI
POP EBX
POP EBP
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
_leave();
end;
 

Similar threads

回复
0
查看
813
不得闲
S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部