一、C++的异常处理
C++中选择用 throw 来抛出异常, catch 来捕捉异常和处理
try
{
// 可能发生异常的语句
// throw 异常对象
}
catch(类型1)
{
// 发生类型1异常时的处理代码
}
catch(类型2)
{
// 发生类型2异常时的处理代码
}
catch (...)
{
// 不管什么异常,都在这里统一处理。
}
throw抛出异常对象,异常对象的类型决定了应该匹配哪个catch语句块;只会按顺序匹配一个catch,匹配成功后将退出整个异常语句,继续下面的代码,而不会再回到try中执行剩下的代码
int main()
{
cout << "1--befroe try block..." << endl;
try
{
cout << "2--Inside try block..." << endl;
throw 10; // int类型的异常
throw "const char *s类型的异常";
cout << "3--After throw ...." << endl;
}
catch (int i)
{
cout << "4--In catch block1 ... exception..errcode is.." << i << endl;
}
catch (const char *s)
{
cout << "5--In catch block2 ... exception..errcode is.." << s << endl;
}
cout << "6--After Catch...";
}
/*
1--befroe try block...
2--Inside try block...
4--In catch block1 ... exception..errcode is..10
6--After Catch...
*/
try中会一直执行到throw抛出了异常对象,并与catch匹配,执行完catch语句块后,将结束整个异常语句块,不会回到try中
void temperature(int t)
{
if (t == 100)
throw "沸点!";
else if (t == 0)
throw "冰点!";
else
{
cout << "temperatore=" << t << endl;
}
}
int main()
{
try
{
temperature(10); // L1
temperature(0); // L2
temperature(100); // L3
}
catch (char const *s)
{
cout << s << endl;
}
return 0;
}
/*输出结果:
temperatore=10
冰点! */
二、python的异常处理
使用try——except语句。
- try里面放入可能发生异常的代码块,当发现异常时,就交给except处理
- except里面写入出现异常时的处理操作(可以接上 else 表示没有异常执行的代码块,但一般是把这块代码放在try中)
- finaly是无论有没有异常都要执行的,如关闭文件
try:
a = int(input("输入a:"))
b = int(input("输入b:"))
c = a / b # a=5,b=0,出现异常ZeroDivisionError # a=1.2,则出现异常ValueError
print("除法的结果:",c) # 没有异常,得到结果
except ValueError:
print("请输入有效的整数")
except ZeroDivisionError:
print("除数不能为0")
finally:
print("管你有没有异常,我就要执行")
和C++一样,python也有一个处理任何异常的类 —— Exception。在下例中,展示了 else 的用法;且一般触发异常,常用自定义打印的方式,来更好得出异常的问题。
try:
a = int(input("输入a:"))
b = int(input("输入b:"))
c = a / b # a=5,b=0,出现异常2
#print("除法的结果:",c)
# 写法1:输出系统判定的异常类型,as+随便命名
# except Exception as ee:
# print(ee)
# 写法2:自己命令当发现异常时输出什么 (常用)
except Exception:
print("出现异常,a={},b={}".format(a,b))
else:
print("除法的结果:",c)
finally:
print("管你有没有异常,我就要执行")
——自定义异常
除了系统自带的一些异常,还可以人为的定义异常来处理某些问题。创建自定义异常的关键如下:
- 创建一个新的类继承自内置的Exception类或其子类。可以为自定义异常类添加额外的属性和方法来满足需求
- 在适当的位置使用raise语句触发自定义异常
下例中,创建了PassWord类来继承Exception类,添加 lens 和 now_len 属性来表示所需长度和实际长度,在__str__方法中返回触发该异常时的结果。
class PassWord(Exception):
def __init__(self,lens, now_len):
self.lens = lens
self.now_len = now_len
def __str__(self): # 重写__str__方法,因为抛出错误时会执行此方法
return ('用户名长度必须大于{},当前输入长度为{}'.format(self.lens, self.now_len))
def demo():
User = input('请输入用户名:')
if len(User) < 4 :
raise PassWord(4,len(User)) # 使用raise抛出异常
else:
print(User)
return User
if __name__ == "__main__" :
demo()
- 同样,也可以使用try-except来捕捉和处理自定义异常。
-注:使用try-except可以不用在自定义异常类里面添加触发异常的结果,因为如何出现异常,不会再调用异常类里的结果,而是转到except里定义的异常结果
class PassWord(Exception):
def __init__(self,lens, now_len):
self.lens = lens
self.now_len = now_len
# def __str__(self): # 重写__str__方法,因为抛出错误时会执行此方法
# return ('用户名长度必须大于{},当前输入长度为{}'.format(self.lens, self.now_len))
def demo():
User = input('请输入用户名:')
if len(User) < 4 :
raise PassWord(4,len(User)) # 使用raise抛出异常
else:
print(User)
return User
if __name__ == "__main__" :
# 写法一;
# try:
# demo()
# except PassWord as p:
# print("捕捉到自定义异常", p.lens, p.now_len)
# print(p.__str__())
# 写法二:
try:
User = input('请输入用户名:')
if len(User) < 4:
raise PassWord(4, len(User)) # 使用raise抛出异常
else:
print(User)
except PassWord as p:
print('用户名长度必须大于{},当前输入长度为{}'.format(p.lens, p.now_len))