`
zsjg13
  • 浏览: 144951 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

Throwing and Catching Exceptions

 
阅读更多

    异常就是一个Python对象,它表示一个 error。

 

1、推卸责任:传播异常

    当一个函数产生了一个异常,它要么是立刻处理该异常,要么是终止运行。如果这个函数没有处理那个异常,则它的 caller 可能会处理此异常。如果 caller 不处理,则它也会立刻终止运行。异常会顺着调用栈一直往上传播,直到某人处理了它。如果就是没有,则整个程序就终止了。

    通常,返回一个值的函数应当返回 None 来指示一个“reasonable” failure,对于“unreasonable” problems 才生成一个异常。

 

2、处理异常

    如果你有一些“受怀疑”的代码(可能会出现异常),此时可以将这些代码放到一个 try: block 中来保护它们。在 try: block 后面,包含一个 except 语句,紧跟着就是用于处理问题的代码。

Listing 5-5: NumberGuess2.py

import random

import sys

# This line chooses a random integer >=1 and <=100.

# (See Chapter 15 for a proper explanation.)

SecretNumber=random.randint(1,100)

print “I’m thinking of a number between 1 and 100.”

# Loop forever (at least until the user hits Ctrl-Break).

while (1): 

    print “Guess my number.”

    # The following line reads a line of input from 

    # the command line and converts it to an integer.

    try:

        NumberGuess=int(sys.stdin.readline())

    except ValueError:

        print “Please type a whole number.”

        continue 

    if (NumberGuess==SecretNumber):

        print “Correct!  Choosing a new number...”

        SecretNumber=random.randint(1,100)

    elif (NumberGuess > SecretNumber):

        print “Lower.”

    else:

        print “Higher.”

 

3、More on exceptions

    一个异常可以有一个 argument, 它提供关于问题的额外信息。argument 的内容(以及甚至它的类型)会随着异常而变化。你捕获一个异常的 argument,是通过在 except语句中提供一个变量:

except ExceptionType, ArgumentVariable。

    可以提供多个 except 语句来处理各种类型的异常。这种情况下,异常会被首个合适的 except 语句来处理。你还可以提供一个通用的 except 语句,它处理任何异常。如果你这么做了,我高度

建议你在处理异常。因为默默地吞没异常可能会掩盖重要的 bugs,like a NameError。这里是一些 cookie-cutter 代码,我把它用于 quick-and-dirty 错误处理:

try:

    DoDangerousStuff()

except:

# The show must go on!

# Print the exception and the stack trace, and continue.

    (ErrorType,ErrorValue,ErrorTB)=sys.exc_info()

    print sys.exc_info()

    traceback.print_exc(ErrorTB)

    在 except 语句后面,可以放一个 else 语句,try: block 中的代码如果没有出现异常就会执行 else 块中的代码。else 块中非常适合写那种不需要 try: block 保护的代码。

    如果你尝试打开一个不存在的文件,Python 会产生一个异常。

try:

    OptionsFile = open("SecretOptions.txt")

except IOError, (ErrorNumber, ErrorString):

    # Assume our default option values are all OK.

    # We need a statement here, but we have nothing

    # to do, so we pass.

    pass 

else:

    # This executes if we opened it without an IOError.

    ParseOptionsFile(OptionsFile)

 

4、Defining and raising exceptions

    你可以利用 raise exceptionType, argument 语句来生成异常。Argument 就是 exception argument 的一个值。Argument 是可选的;不过不提供,exception argument 就是 None。

    一个异常可以是一个 string、 一个类、或者一个对象。Python core 生成的大多数异常都是 classes,并带一个是该 class的一个实例的 argument。

    定义新异常相当简单,下面就是一个:

def CalculateElfHitPoints(Level):

    if Level < 1:

        raise “Invalid elf level!”,Level

    # (The code below won’t execute if we raise

    # the exception.)

    HitPoints = 0

    for DieRoll in range(Level):

        HitPoints += random.randint(1,6)

    为了捕捉一个异常,except 语句必须指向相同的抛出的异常。Python 通过 reference identity 来比较 string exceptions。因此,如果代码生成“BigProblem”,and a except-clause for "BigProblem,",except语句就不会捕捉该异常。(这些 string 是相等的,但可能没指向内存中的相同点)。要正确地处理异常,应该用一个命名常量字符串,或一个 class。

 

5、Cleaning up with finally

    还有一个处理失败的机制就是 finally 块。你可以提供 except 语句,或一个 finally 语句,不必都提供。

    例如,多线程程序常常用锁来阻止线程踩踏各自的数据。如果一个线程得到了一个锁并崩溃了但没有释放这个锁,那么其他线程将永远等待——这就叫死锁。finally 语句就很适合这样的工作:

try:

    DataLock.acquire()

    # ... do things with the data ...

finally:

    # This code *must* execute. The fate of the

    # free world hangs in the balance!

    DataLock.release() 

分享到:
评论

相关推荐

    Java.SE.7.Programming.Essentials

    分享的图书,有关Java SE 7 SDK标准的书,全英文。相应章节: Chapter 1. Introducing the Basics of Java Chapter 2. Applying Data Types in Java Programming ... Throwing and Catching Exceptions in Java

    深入java虚拟机(inside the java virtual machine)

    Throwing and Catching Exceptions The Exception Table Play Ball!: A Simulation On the CD-ROM The Resources Page 18 Finally Clauses Miniature Subroutines Asymmetrical Invocation and Return Hop ...

    论C#与Java之异同

    10. **Throwing and Catching Exceptions** - **异常处理**: C#和Java都采用了类似的异常处理机制,支持try-catch-finally语句。 11. **Member Initialization at Definition and Static Constructors** - **...

    Microsoft Visual C# 2013 Step by Step,最新资料

    Trying code and catching exceptions .136 handled Excepti 137 Using multiple catch 138 Catching multiple exceptions 139 Propagating exceptions 145 Using checked and unchecked integer arithmetic 147 ...

    more exceptional c++.rar

    异常处理是C++中的一项重要特性,它允许程序员在遇到预期之外的情况时,通过抛出异常(throwing exceptions)来中断正常流程,并在程序的其他地方捕获(catching exceptions)并处理这些异常。这种方式比传统的错误...

    java异常处理详细介绍

    - **捕获异常(Catching Exceptions)**:一旦异常被抛出,Java会从当前方法开始,沿调用栈向上回溯,寻找能处理这种类型异常的`catch`块。匹配的`catch`块会捕获异常并执行相应的处理代码。 - **异常类层次**:...

    java 异常处理ppt

    异常处理主要涉及两个关键部分:捕获异常(catching exceptions)和声明抛弃异常(throwing exceptions)。在Java中,异常处理通常使用`try-catch`块来实现。`try`块包含可能会抛出异常的代码,而`catch`块则包含...

    异常处理.ppt异常处理.ppt异常处理.ppt异常处理.ppt异常处理.ppt

    - **抛出异常(Throwing Exceptions)**:当异常发生时,使用`throw`关键字可以明确抛出一个异常对象,通知运行时系统有异常需要处理。 - **捕获异常(Catching Exceptions)**:使用`try-catch`语句块来捕获并...

    java程序中的异常处理

    2. **异常抛出(Throwing Exceptions)**: - `throw`关键字用于手动抛出一个异常。在上面的例子中,当年龄值超出合理范围时(小于0或大于等于160),`setAge()`方法会通过`throw new IntegerException(age);`...

    Java异常处理入门.pptx.pptx

    - **抛出(Throwing)**:当发现异常时,可以使用`throw`关键字抛出一个异常对象。这可以是预定义的异常,也可以是自定义的异常。 3. **try-catch语句的使用** - `try`块:包围可能会抛出异常的代码,当异常发生...

    java异常处理

    - 捕获(Catching):当异常发生时,程序会尝试通过`try-catch`块来捕获并处理异常。 - 抛出(Throwing):当遇到无法正常处理的情况时,可以使用`throw`关键字抛出一个异常。 - 异常处理链(Exception Chaining...

    java学习笔记——异常

    Java中的异常分为检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常如IOException、SQLException,需要在方法声明或捕获,否则编译无法通过。运行时异常包括NullPointerException...

    Python中使用装饰器来优化尾递归的示例

    if it is its own grandparent, and catching such exceptions to fake the tail call optimization. This function fails if the decorated function recurses in a non-tail context. """ def func(*args, **...

    Java语言程序设计6-3-java第6章(异常处理)(精).doc

    4. **自定义异常(Custom Exceptions)**:除了使用Java标准库中预定义的异常类之外,开发者还可以创建自己的异常类来更好地适应特定的应用场景。 ### try-catch-finally语句详解 1. **try块**:此块包含了可能会...

    例外

    异常分为检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常在编译期间必须被处理,而运行时异常则可以在运行时处理,或者选择不处理。 2. **异常的层次结构**: Java的异常体系...

    ExceptionHandling

    2. **抛出异常(Throwing an Exception)**: 如果在代码中检测到一个错误条件,可以使用`throw`关键字手动抛出异常。例如: ```csharp if (value ) throw new ArgumentException("Value cannot be negative."); `...

    Python Power - The Comprehensive Guide (2008).pdf

    And Now for Something Completely Different… ....................................................18 CHAPTER 2 Python Language Overview ....................................................................

Global site tag (gtag.js) - Google Analytics