zoukankan      html  css  js  c++  java
  • 六、异常处理、日志打印、文件操作

    异常处理

    场景:日常开发中,有些代码块你不能保证它是否会成功运行,比如连接hive时,如果网络不好可能会连接失败,报请求超时等错误,那么此时我们不希望这个错误被报出来,我可以尝试再次连接或者是换一种方式去连接等,此时就需要用到异常处理功能了。

    1.try…except结构
    

    异常处理结构中最常见也最基本的结构。其中try子句中的代码块包含可能出现的语句,而except子句用来捕捉并处理异常。如果try中的代码块没有出现异常,则继续往下执行。

    import requests
    from requests import ReadTimeout
    
    def get_page(url):
        try:
            response = requests.get(url, timeout=1)
            if response.status_code == 200:
                return response.text
            else:
                print('Get Page Failed', response.status_code)
                return None
        # except (ConnectionError, ReadTimeout):    #捕捉指定的异常
        #     print('Crawling Failed', url)
        #     return None
        except Exception:    #捕捉所有异常
            print('Crawling Failed', url)
            return None
    
    
    def main():
        url = 'https://www.baidu.com'
        print(get_page(url))
    
    
    if __name__ == '__main__':
        main()
    
    2. try …except…else结构
    

    带else子句的异常处理结构是一种特殊形式的选择结构。如果try中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下不会执行else中的代码。如果try中的代码没有抛出任何异常,则执行else块中的代码。

    def get_page():
        try:
            url = ['45','6789']
            print(url)
    
        except Exception:  # 捕捉所有异常
            print('发生错误了,但是被我捕获到了,哈哈哈哈。。')
            return None
        else:
            print(url[0])
    
    
    def main():
        get_page()
    
    
    if __name__ == '__main__':
        main()
    
    3. try…except…finally结构
    

    该结构指中finally子句中的语句块指无论是否发生异常都会执行

    def get_page():
        try:
            url = ['45','6789']
            print(url[3])
    
        except Exception:  # 捕捉所有异常
            print('发生错误了,但是被我捕获到了,哈哈哈哈。。')
            return None
        else:
            print('只有在没有发生错误的时候我才能执行')
        finally:
            print("无论try是否发生错误,我都会执行的")
    
    
    def main():
        get_page()
    
    
    if __name__ == '__main__':
        main()
    

    log日志

    
    import logging
    # 第一步,创建一个logger
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)   # Log等级总开关
    
    # 第二步,创建一个handler,用于写入日志文件
    logfile = './log2.txt'
    fh = logging.FileHandler(logfile, mode='a')
    fh.setLevel(logging.DEBUG)  # 用于写到file的等级开关
    
    # 第三步,再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.WARNING)    # 输出到console的log等级的开关
    
    # 第四步,定义handler的输出格式
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)
    
    # 第五步,将logger添加到handler里面
    logger.addHandler(fh)
    logger.addHandler(ch)
    
    if __name__ == '__main__':
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warning message')
        logger.error('error message')
        logger.critical('critical message' )  
    

    文件操作

    1.文件介绍
    

    文件包括文本文件和二进制文件(声音、图像、视频)
    2.读文件

    #打开文件
    f = open('./test.txt','r')
    #读取文件
    f.read()
    #关闭文件
    f.close()
    

    上一步的操作相当于

    with open('./test.txt','r') as f:
       print(f.read())
    
    
    3.文件的打开方式
    
    模式 描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • 相关阅读:
    洛谷P3376 【模板】网络最大流
    bzoj 4598: [Sdoi2016]模式字符串
    JAVA类(下)
    2019DDCTF部分Writeup
    Atom配置(VIM党) · iuunhao
    Tips
    rsync auth failed on module xxx
    基于mykernel完成时间片轮询多道进程的简单内核
    机器学习技法笔记(2)-Linear SVM
    css之制作三角形
  • 原文地址:https://www.cnblogs.com/lpdeboke/p/12773857.html
Copyright © 2011-2022 走看看