| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 595 人关注过本帖
标题:求助:关于异常处理.
只看楼主 加入收藏
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
 问题点数:0 回复次数:4 
求助:关于异常处理.

各位老大,小弟写了一段代码.不知道为什么无法截获异常.请各位指点一下.代码如下:
var
SmallNumber:shortint;
X,Y:Integer;
begin
try
X:=100;
Y:=75;
SmallNumber:=x*y;
except
on ERangeError do showmessage('数据越界错误!');
end;
end;

2006-04-02 16:25
ysp_1984
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:371
专家分:0
注 册:2006-1-5
收藏
得分:0 

整数异常 
整数异常都是从一个EIntError类派生的,但程序运行中引发的总是它的子类:EDivByZero,ERangeError,EIntOverFlow。 
 整数异常及其产生原因

异常类 引发原因

EDivByZero 试图被零除
ERangeError 整数表达式越界
EIntOverFlow 整数操作溢出
━━━━━━━━━━━━━━━━━━━━━━ 

ERangeError当一个整数表达式的值超过为一个特定整数类型分配的范围时引发。比如下面一段代码将引发一个ERangeError异常。 
var
SmallNumber: ShortInt;
X , Y: Integer;
begin
X := 100;
Y := 75;
SmallNumber := X * Y;
end;

  特定整数类型包括ShortInt、Byte以及与整数兼容的枚举类型、布尔类型等。例如:  

type
THazard = ( Safety , Marginal , Critical , Catastrophic );
var
Haz: THazard;
Item: Integer;
begin
Item:= 4;
Haz:= THazard ( Item );
end; 
由于枚举数越界而引发一个ERangeError异常。

  数组元素越界也会引发一个ERangeError异常,如: 

var
Values: array[1..10] of Integer;
i: Integer;
begin
for i := 1 to 11 do
Values[i] := i;
end;
ERangeError异常只有当类型检查打开时才会引发。这可以在代码中包含{$R+} 编译指示或设置IDE Option|Project的Range_Checking Option选择框。

  EIntOverFlow异常类在Integer、Word、Longint三种整数类型越界时引发。如:
var
I : Integer;
a,b,c : Word;
begin
a := 10;
b := 20;
c := 1;
for I := 0 to 100 do
begin
c := a*b*c;
end;
end;
引发一个EIntOverFlow异常。
EIntOverFlow异常类只有在编译选择框Option|Project|Over_Flow_Check Option选中时才产生。当关闭溢出检查,则溢出后变量保留该类整数的最大范围值。
你按照上面红色的区域设置,看看行不行.


[此贴子已经被作者于2006-4-5 2:33:58编辑过]


心中的那片蓝天,永远为你而存在... ...
2006-04-05 02:27
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
斑竹你好,当初没有截获异常的原因的确是没有在编译过程中打开类型检查,但是后来又出现了一个问题.是关于溢出异常的.具体情况见下列代码:
var
X,Z,y:integer;
begin
X:=2147483647;
try
{$q+}
y:=2147483647;
Z:=x+y;
except
on EIntOverFlow do showmessage('数据溢出错误!');
end;
showmessage(inttostr(z));
{$q-}
end;
看见红色的那一句没有如果没有这一句delphi也检查不到溢出异常.奇怪的是按说showmessage(inttostr(z));不在try..except..end;之中不会对数据溢出检查造成影响,但是不知道为什么没有这一句try却不能
截获溢出异常.
2006-04-05 19:33
ysp_1984
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:371
专家分:0
注 册:2006-1-5
收藏
得分:0 

showmessage(inttostr(z));这一句在不在try ...eccept...end中都会产生异常。使用try ...eccept...end语句的目的是为了能更好的处理异常,防止应用程序的停止运行,但并不是不再try ...eccept...end这里面的语句就不会产生异常。把可能出现异常的语句放在try except之间,当异常发生时,便不会在执行try except之中异常语句之后的语句。而处理eccept...end之间的语句。
没有
showmessage(inttostr(z))也不能产生异常。这句我也不知为什么非得用。我以为必须得使用变量z之后才能产生异常。我试了试定义了一个float类型的变量sum,将sum:=z;但也不产生异常。


心中的那片蓝天,永远为你而存在... ...
2006-04-06 09:35
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
关于try..except..end;这个我也知道那是一个保护模块,目的是让异常产生是按我们的构想进行处理.另外关于上例中的那个z,最初我也想过是不是必须得使用变量z时才能产生异常,如果是那样的话,不一定非得用showmessage.但是我尝试了一下用其他方法调用z但是try仍然不会截获异常.哎,问题没解决,辗转反侧.
2006-04-06 20:16
快速回复:求助:关于异常处理.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026900 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved