在讨论函数体内部的异常时,我们先了解python中的异常是什么。
Python 具备完善的异常(Exception)机制,并且在某种程度上鼓励我们使用异常
一般情况下代码中出现报错,程序就会中断,后续代码不会执行,异常机制就是处理这种情况
他的语法结构及使用方法如下:

try: 
	在try语句下面,写一些有可能会出错的代码
	try语句中,如果没有报错(错误异常),那么会将try块语句中全部执行完,且不会执行except语句
	如果出现异常,那么try块语句中,之后出现异常所在行的语句,剩下后面的程序语句不会被执行
	
except ValueError:  (异常类)   #没有异常就不会执行
	出现该异常时,就会执行该块语句
	可以规定多个except异常类
	只要有一个except语句被执行,异常被捕获,那么其他的except语句都不会被执行
	类似以if,else判断语句
	可以直接使用异常的关键字(运行py文件时,会自动导入异常类这个模块)
	也可以使用一个except同时处理多个异常,可以使用括号括起来作为一个元组
except ValueError as err: 
	使用except会捕获特定的异常,将其赋值到as后面的变量
	相当于赋值操作,不同as作为别名
	
except:(没有规定异常类型,就会捕获所有的异常或者规定类型Exception)			
	放在最后面

else: 
	print("如果没有异常才会执行这条语句,有异常已经被捕获就不会执行")

finally: 
	print("不管你是否有异常,finally都一定会执行,即使在函数中上面有执行return关键字,即使报错,finally也会执行")
	
print("继续往下执行")

看完上面用法,你应该知道try和except就是用来处理报错,让程序变成正常情况依然能执行下去。
现在我们知道except可以接收python中异常class中定义过的异常,那我可以自定义异常吗?
这就需要raise关键字

try:
    price = input("请输入橘子价格: ")
    weight = input("请输入橘子重量: ")
    result = price / weight
except:
    User_DefinedError = Exception("请调用我自定义的异常") #调用Exception方法
    raise User_DefinedError
>>>>
Traceback (most recent call last):
  File "E:/python/Py_29/test.py", line 97, in <module>
    raise User_DefinedError
Exception: 请调用我自定义的异常

介绍到这里,想必你已经对异常及抛出异常有一定了解的
现在来介绍今天的主要目的,如何对函数捕捉异常?首先来看一个问题
如果你使用过unittest,会发现python会捕捉try里的assert异常,导致错误用例反而通过

class TestAssertTry(unittest.TestCase):
	def test_01(self):
		self.assertEqual(1, 2)
	
	def test_02(self):
		try:
			self.assertEqual(1, 2)
		except Exception as e:
			print("")
		
	def test_03(self):
		try:
			self.assertEqual(1, 2)
		except Exception as e:
			self.assertEquals(1, 2)

结果是01和03用例报错,02通过。这是为什么呢?
这里就要解释下函数中异常机制,可以在函数体内部使用try,except捕捉异常,
但是函数内部被捕捉到异常后,仍需要确定好return返回值,否则函数不会报错,且函数正确执行

这就是上图中的错误
当然也可以在函数外部捕捉函数内部的异常

def calculate(a):
    """
    判断输入是否为数字
    :param a: 用户输入
    :return: float类型
    """
    if a.replace(".","",1).isdigit() :
        return float(a)
    else:
        return False
try:
    price = input("请输入: ")
    price =calculate(price)
    print(calculate(price))
except Exception:
    print("能继续执行吗?")
>>>>输出
>能继续执行吗?

运行后发现函数就没有返回值了,就只抛出了异常被外部except捕获
那我们想既有返回值,又要抛出异常怎么办?
详见第二篇文章。。。。