您好,匿名用户
随意问技术百科期待您的加入

新手关于python“引发异常的”一点困惑,附代码,求指教。

0 投票

最近正在自学python,看的是简明python教程。

现在学到13章,引发异常。在关于raise语句的用法上。我有些困惑,在此寻心求教。

代码如下

#!/usr/bin/python
# Filename: raising.py

class ShortInputException(Exception):
    '''A user-defined exception class.'''
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast

try:
    s = raw_input('Enter something --> ')
    if len(s) < 3:
        raise ShortInputException(len(s), 3)
    # Other work can continue as usual here
except EOFError:
    print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
    print 'ShortInputException: The input was of length %d, \
          was expecting at least %d' % (x.length, x.atleast)
else:
    print 'No exception was raised.'

困惑1:

try:
    s = raw_input('Enter something --> ')
    if len(s) < 3:
        raise ShortInputException(len(s), 3)

在这里raise模块里的ShortInputException类为什么用到len(s)和3 这2个值呢?这2个值在这里的意思我能猜明白,但是不能理解他们存在这里的意义,能告诉我他们运用在这里的意思么?前面代码创建类时的ShortInputException(Exception):跟这里的关系是什么呢?想了很久没想出来,我大概是掉进一个误区里去了。

困惑2:

except ShortInputException, x:
    print 'ShortInputException: The input was of length %d, \
          was expecting at least %d' % (x.length, x.atleast)

这里的x又指的是什么呢?他是在给ShortInputException(Exception)赋值吗?那前面怎么没有关于x的定义和说明呢?

在此之前我只接触过用class创建默认值的类,综合上面这2个问题,请问我实在创建类方面需要多加理解和努力么?

这些我都能猜出他们形式上表达出来的模样,但是不懂得他们逻辑上的意思。

这些问题想了很久还是不理解,望得到解答。谢谢。

用户头像 提问 2012年 12月1日 @ Dante 上等兵 (290 威望)
分享到:

1个回答

0 投票
 
最佳答案

一、raise 作为一个抛出异常的语句,在你的例子中,raise抛出一个ShortInputException异常,这里指的是抛出一个ShortInputException实例,所以len(s)和2就是作为实例化的参数。

二、

except ShortInputException, x:
    print 'ShortInputException: The input was of length %d, \
          was expecting at least %d' % (x.length, x.atleast)

x其实就是shortInputException的实例,你可以通过尝试一下:

except ShortInputException, x:
    if isinstance(x,ShortInputException):
        print "x is an instance of ShortInputException"

下面是一段摘抄至《python核心编程》的一段raise的用法,希望对你有帮助!

raise [SomeException [,args [,traceback]]]
第一个参数,SomeException,是触发异常的名字。如果有,它必须是一个字符串,类或实例。如果有其他参数(args或traceback),就必须提供SomeException
第二个参数为可选的args,来传给异常。这可以是一个单独的对象,也可以是一个对象的元组。当异常发生时,异常的参数总是作为一个元组传入。如果args原本就是元组,那么就将其传给异常去处理;如果args是一个单独的对象,就生成只有一个元素的元组(就是单元素元组)。大多数情况下,单一的字符串用来指示错误的原因。如果传的是元组,通常的组成是一个错误的字符串、一个错误编号,可能还有一个错误的地址,比如文件,等等
最后一项参数,traceback,同样是可选的。如果有的话,则是当异常触发时新生成的一个用于异常-正常化的跟踪记录对象。当你想重新引发异常时,第三个参数很有用(可以用来区分先前和当前的位置)
用户头像 回复 2012年 12月1日 @ Fiora 上等兵 (297 威望)
选中 2012年 12月1日 @Dante
提一个问题:

相关问题

0 投票
1 回复 49 阅读
0 投票
1 回复 28 阅读
0 投票
1 回复 33 阅读
用户头像 提问 2012年 12月1日 @ Akali 上等兵 (237 威望)
0 投票
0 回复 22 阅读
+1 投票
1 回复 250 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...