技术背景

在前面一篇博客中我们介绍了在python中自定义异常以及异常的捕获。这里我们要介绍另外一种形式的用户提醒:告警。我们这里就不给出一些过于官方或者技术的定义了,在实际项目中的使用场景主要有这么一点区别:异常信息表示程序中的某一个步骤输入不正确而导致没办法继续往下执行,但是用户自己可以选择抑制这些异常信息继续往下执行。也就是说,能否继续执行的决定权在用户手里,而我们的程序后端给出的建议是终止运行。告警信息与异常信息的最大区别就在于,我们在程序后端就判定这个问题并不影响程序的执行,我们只播报出这个告警信息给用户,表明我们在后端是没有处理这个信息的,由用户来决定是否修改或者终止运行。这里我们可以看出主要的区别在于后端对这个异常事件的性质的判定,后端决定停止就抛出异常,后端决定继续就抛出告警,这是实际项目中的经验之谈。

Python告警定义

这里有一篇博客比较全面的介绍了在python中定义告警的类别和方法,这里我们选取一种最容易使用也最常用的方法,直接使用warnings.warn的功能:

# warning_test.py

import warnings
import sys if sys.argv[1] == '-w':
warnings.warn('This is the warning message you wanted!') else:
print ('No warnings!')

在这个示例代码中,我们从命令行的输入来获取参数,如果获取到命令行的参数是-w,就抛出这个告警,在日常的项目程序中这表示一个异常情况的判定开关。如果没有满足判定条件,就打印No warnings信息。我们先来看下有异常情况下所抛出的告警信息:

[dechin@dechin-manjaro warning]$ python3 warning_test.py -w
warning_test.py:7: UserWarning: This is the warning message you wanted!
warnings.warn('This is the warning message you wanted!')

另外再看一下没有满足判定条件情况下的输出:

[dechin@dechin-manjaro warning]$ python3 warning_test.py -n
No warnings!

这里从结果中可以看到,我们对告警的定义就完成了。

Python告警抑制

在前面一篇博客中我们介绍了异常的抑制,同样的我们也可以抑制告警信息。但是这里用抑制来形容这个行为可能并不是很合适,只是一个习惯性的叫法,因为告警本身就不影响程序的正常运行,应该说只是过滤掉告警信息的打印输出。告警抑制的方案也很简单,warnings.filterwarnings就自带了这个功能,具体代码实现如下:

# warning_test.py

import warnings
import sys warnings.filterwarnings('ignore') if sys.argv[1] == '-w':
warnings.warn('This is the warning message you wanted!') else:
print ('No warnings!') print ('Continue to running.')

可以看到我们只是在代码中加了一行warnings.filterwarnings的代码,过滤掉了所有的告警信息的输出。此外我们在程序的最后加了一行打印信息,以确认我们在抛出告警信息并且被抑制之后,还能够继续执行后面的程序(注意,不抑制也能继续执行)。

[dechin@dechin-manjaro warning]$ python3 warning_test.py -w
Continue to running.

最后我们发现,告警被成功抑制,并且告警之后的程序也能够正常的运行。

总结概要

告警和异常信息的定义与处理,在网络编程项目和各种实际计算的场景中都会被用到。这里我们通过两篇博客进行了比较简单的介绍,对于没有特殊要求的用户而言,按照示例中给出的样板直接修改就能够使用。更多的时候是规范的要求,我们可能需要修改异常和告警所继承的类型。同时对于异常和告警信息,我们也能够有方案去进行抑制,更加适配各种不同的场景需求。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/warnings.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

Python基础之告警定义与告警抑制的更多相关文章

  1. Python基础之异常定义

    技术背景 在各类python的项目中,总会涉及到项目自身相关的一些约束条件.这些约束条件体现在,当用户输入的参数或者文件不符合项目要求时,就拒绝这个参数的输入并且播报出来,提醒用户自行修改,而这一过程 ...

  2. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  3. python基础知识08-类定义、属性、初始化和析构

    1.类的定义 class 类 是独立存放变量(属性/方法)的一个空间. 每个实例都是一个独立的变量空间.不同实例之间的空间互相不可见. 一个实例的特征,就是属性. 定义在类中的私有属性也可以被子类继承 ...

  4. python基础教程:定义类创建实例

    类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 >>>class Person(object): #所有的类都是从object类继承 pass #pass ...

  5. Python基础--函数的定义和调用

    一.函数的作用: 提高代码的可读性,减少代码的冗余,方便调用和修改,组织结构清晰 二.函数的定义:函数遵循先定义后调用的原则 1.无参函数 def funcname(): #def 是关键字,后跟函数 ...

  6. Python基础之函数定义及文件修改

    函数 函数的定义 #登录函数和注册函数 def register(): """注册函数""" username = input('请输入你的 ...

  7. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  8. python基础实践 -python是一门动态解释性的强类型定义语言

    python是一门动态解释性的强类型定义语言 Python能做什么? Python是一门综合性的语言,你几乎能在计算机上通过Python做任何事情,以下是Python应该最广泛的几个方面: 1.网络应 ...

  9. 『Python基础-3』变量、定义变量、变量类型、关键字Python基础-3』变量、定义变量、变量类型、关键字

    『Python基础-3』变量.定义变量.变量类型.关键字 目录: 1.Python变量.变量的命名 2.变量的类型(Python数据类型) 3.Python关键字 1. Python 变量.变量的命名 ...

随机推荐

  1. TypeScript TSConfig All In One

    TypeScript TSConfig All In One tsconfig.json https://www.typescriptlang.org/tsconfig https://www.typ ...

  2. string logo(字符画),website,html5,css3,atom ide

    1 <!DOCTYPE html> <!-- Powered by... _ _ ____. ______ ._______. _______ ___ ___ sssssssss \ ...

  3. TensorFlow & Machine Learning

    TensorFlow & Machine Learning TensorFlow 实战 传统方式 规则 + 数据集 => 答案 无监督学习 机器学习 神经元网络 答案 + 数据集 =&g ...

  4. nest cli bug

    nest cli bug Error: Collection "@nestjs/schematics" cannot be resolved. Error: Collection ...

  5. text image & 思维脑图 & xmind

    text image & 思维脑图 text-image 图片读 rgb 值->灰度值->字符; rgb->灰度值的公式 google 一下就有,灰度值传字符部分,从灰度值从 ...

  6. py django

    创建项目 $ django-admin startproject server 运行项目 $ cd server $ python manage.py runserver 创建一个模块 $ pytho ...

  7. js 检测浏览器开发者控制台是否被打开

    var element = new Image(); Object.defineProperty(element, "id", { get: function () { debug ...

  8. js 位掩码

    原文 定义掩码 const mask0 = parseInt("00000001", 2); const mask1 = parseInt("00000010" ...

  9. 为什么NGK推出的DEFI项目这么火热?

    进入到2020年的下半年,DeFi的锁仓量基本上是以日破新高的态势,不断的成为一个独角兽.DeFi逐渐形成一个独角兽的同时,也在不断的给区块链生态赋能,源源不断进行金融价值输送.所以加密货币体量的不断 ...

  10. 【从零开始撸一个App】Fragment和导航中的使用

    Fragment简介 Fragment自从Android 3.0引入开始,它所承担的角色就是显而易见的.它之于Activity就如html片段之于页面,好处无需赘述. Fragment的生命周期和Ac ...