写代码的时候,习惯考虑很多细节问题。比如输入类型的合法性,值的合法性等等。
所以在进入代码的核心部分之前,有很大篇幅的代码都是一些if else
语句。
这样并不是不好,而是当输入比较复杂的时候,就要考虑非常多的细节。
在核心代码之前放一堆if else
,会影响一段代码的紧凑性,也会使维护变得困难。
比如需要校验输入中有没有这些key
,输入的类型是str
,还是list
,是否符合预期等等。
如果说一个输入连基本的key都不对,那么可以认为这是一个异常。这样的情况完全可以用异常处理。我见过有的人就会这样去写:
if 'key1' in data and 'key2' in data and 'key3' in data:
if type(data['key1']) == list and type(data['key2']) == str and type(data['key3']) == str:
for datas in data['key1']
value1 = data[key1]
value2 = data[key2]
value3 = data[key3]
...
上面的代码还不算太复杂,因为只是随便造了一点数据。这种代码也不是不好,只是这不是严格意义的输入校验,而更像是一种异常。如果是一般的输入校验,当然最好用if
语句去处理。因为异常本来就是用来处理异常的,况且有的语言是没有异常这种工具可以用的。
但是对于这种连key都不存在的异常输入,更优雅的写法是进行异常捕获
:
try:
for datas in data[key1]
value1 = data[key1]
value2 = data[key2]
value3 = data[key3]
except TypeError as e:
do some thing with e
except KeyError as e:
do some thing with e
except Exception as e:
do some thing with e
这样的代码紧凑,优雅,维护成本更低。
当然了,我们需要熟悉一个编程语言的常见异常种类,才能够在处理异常情况的时候得心应手。
对于不太熟悉的异常,去官网一搜就有。
注意
但是千万不要写成这种代码:
try:
for datas in data[key1]
value1 = data[key1]
value2 = data[key2]
value3 = data[key3]
except Exception as e:
do some thing with e
因为没有详细的异常种类,出了错也没有适当的处理,也不好排查错误原因。