Python_异常

异常处理

异常:

在程序运行过程中影响程序正常运行的内容

常见的异常:
1) 名称错误
print(s)

NameError: name 's' is not defined


2) 索引错误
li = [1,2,3]
li[10]

IndexError: list index out of range


3) 除零错误
10/0

ZeroDivisionError: division by zero


4) key值错误
d = dict(a=1, b=2)
d['c']

KeyError: 'c'   


5) 属性错误
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def echo(self):
        return  self.name

    def __str__(self):
        return  "Student(%s)" %(self.name)    
   
s = Student('黎明', 30)
print(s.scores)
s.echo1()

AttributeError: 'Student' object has no attribute 'scores'
AttributeError: 'Student' object has no attribute 'echo1'   



6) 文件找不到
with open('/tmp/aa') as f:
    print(f.read()[:10])
    
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/aa'
异常结构
 BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning
异常处理:

为什么需要异常处理?
因为异常处理可以让你的程序更加健壮, 可以清晰的快速修复异常。

语句: try…except… else…finally…

示例1:

import  time
try:
    # 如果你觉得代码可能出现问题, 那么放在try语句中, 只执行一次;
    print(s)
    print("hello")
except NameError as e:   # 对于异常进行一个重命名;记录了异常的详细信息;
    # 可能执行一次, 也可能不执行;
    print("名称错误")
    with open("except.log", 'w') as f:
        f.write(time.ctime() + ' ')
        f.write(str(e) + '\n')
finally:
    # 无论是否出现异常, 肯定会执行一次,
    print("处理结束")

运行结果:
在这里插入图片描述

生成的日志文件:
在这里插入图片描述
示例2:

import  time
try:
    # try语句只执行一次
    print('hello')
    with open('/etc/aa') as f:
        print(f.read()[:5])

    print("文件读取结束")
    
    # try语句中一旦出现问题, 后面的语句(try里面的)不执行
    li = [1, 2, 3, 4]   
    print(s)
    print("hello")
    
except (NameError, IndexError, FileNotFoundError) as e:          
    with open("except.log", 'a+') as f:
        f.write(time.ctime() + ' ' + str(e) + '\n')
finally:
    # 无论是否出现异常, 肯定会执行一次,
    print("处理结束")

运行结果:
在这里插入图片描述
生成的日志文件:
在这里插入图片描述
官方案例:

class A(Exception):
    pass    

class B(A):
    pass    

class C(B):
    pass    

class D(C):
    pass    

for cls in [B,C,D]:
    try:
        raise cls()

    except D:
        print('D')

    except C:
        print('C')

    except B:
        print('B')

在这里插入图片描述

import sys    
# sys模块接收脚本传入的参数

for arg in sys.argv[1:]:
    try:
        f = open(arg,'r')
    except OSError:
        print('cannot open', arg)
    else:
        # 如果try语句中没有产生任何异常和错误, 才执行的语句;
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

在这里插入图片描述
sys模块

print(sys.argv)
返回的是一个列表, 第一个元素是脚本名称,后面一个元素是脚本后传入的参数

print(sys.argv[1:])
返回脚本传入的参数
抛出异常

try…except… else…finally… ==== 捕获异常
raise ==== 抛出异常

示例:

age = int(input("Age:"))
class AgeError(Exception):
    pass

if age < 0 or age > 120:
    raise  AgeError
else:
    print(age)

在这里插入图片描述

调试断点之assert

assert语句是一种插入调试断点程序的一种便捷的方式。

assert语句的使用格式:assert expression(表达式)

这个语句是等价于下面的这个句式:

    if __debug__:
        if not expression: raise AssertionError

示例:

def is_huiwen_num(num):
    snum = str(num)
    return snum == snum[::-1]

def is_prime(num):
    assert num > 1
    from math import sqrt
    for i in range(2,int(sqrt(num) + 1)):
        if num % i == 0:
            return False
    else:
        return True

if __name__ == '__main__':
    try:
        assert is_huiwen_num(101) == True, 'Error'
        assert is_huiwen_num(123) == False, 'Error'
    except AssertionError as e:
        print(e)
    else:
        print('测试用例全部通过...')

    try:
        for num in [3,7,11,13]:
            assert is_prime(num) == True, 'Error'
        for num in [12,20,99999,132]:
            assert is_prime(num) == False, 'Error'
    except AssertionError as e:
        print(e)
    else:
        print('测试用例全部通过...')

在这里插入图片描述

日志处理之logging

日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分。

根据事件的轻重可分为以下几个级别:
DEBUG: 详细信息,通常仅在诊断问题时才受到关注。整数level=10
INFO: 确认程序按预期工作。整数level=20
WARNING:出现了异常,但是不影响正常工作.整数level=30
ERROR:由于某些原因,程序 不能执行某些功能。整数level=40
CRITICAL:严重的错误,导致程序不能运行。整数level=50

默认的级别是WARNING,也就意味着只有级别大于等于的才会被看到,跟踪日志的方式可以是写入到文件中,也可以直接输出到控制台。

示例:

import logging
# 配置日志的信息:
#   1). 日志级别: debug, info, warning, error, critical
#   2). level: 指日志级别为info及以上的日志信息会被记录到文件中;
#   3). format: 指定日志的格式, 可以去logging.Formatter查看参考信息
logging.basicConfig(filename='my.log', level=logging.WARN, format="%(asctime)s-%(filename)s-%(lineno)d- %(levelname)s: %(message)s ")
logging.debug("这是一个调试信息")
logging.error("数据库更新失败")
logging.critical("数据信息删除失败")

生成的日志文件:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## 讲师介绍: 近 5 年个人投资理财年化收益平均超 25%。如果你也想提升自己的睡后收入,轻松赚钱,那么这门课就是为你量身打造。课程基于一个完整真实的量化交易业务来讲授,并融入老师的理财经验以及使用编程技术辅助投资的技巧,让你面对各种复杂投资情况也能做到游刃有余。 ## 学习目标: 从不懂“理财”开始到实现自动交易,成为一个“技术流”理财高手 编程技术 + 核心量化策略 + 交易系统开发 + 讲师经验分享,学会用技术辅助理财 本课程从最基础的什么是量化开始讲起,即使对投资理财不了解同样可以学习,轻松入门无压力。 从如何获取数据开始,到实现实盘交易,课程对量化交易的每一步都进行细致讲解,为你铺开量化交易的每一个细节。 不仅仅只是教你学会使用某种工具,更会教给你量化交易的投资思想,让你面对各种情况都游刃有余。 ## 课程亮点: 设计适合自己并能适应市场的交易策略,才是量化交易的灵魂 课程亲手带你设计并实现两种交易策略,快速培养你的策略思维能力 1. 择时策略:通过这个策略学会如何利用均线,创建择时策略,优化股票买入卖出的时间点。2. 选股策略:掌握选股策略的核心逻辑,并基于收益率创建动量选股策略,并验证其有效性。 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 第三方平台大而全,不易扩展,效率还差,信息安全也是大问题,打造自己的交易平台才是更优解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值