为什么Python中的try/except需要一个except块?

为什么Python中的try/except需要一个except块?,python,try-catch,except,Python,Try Catch,Except,我知道它的作用,但我不明白我们为什么要这么做?为什么我们要试着去做些什么 例如: 对于i,枚举中的值(arr): 尝试: 结果_dict[值]+=1 除KeyError外: 结果dict[值]=1 除了keyrerror,我为什么还要做其他事情?我不知道为什么会抛出KeyError。为什么我不能这么做 result_dict[value] += 1 首先 除了尝试/捕获之外,还有什么进入块内?我知道必须抛出错误,但是在except块内必须执行什么条件 对不起,如果我的问题太愚蠢了。我是初学者

我知道它的作用,但我不明白我们为什么要这么做?为什么我们要试着去做些什么

例如:

对于i,枚举中的值(arr):
尝试:
结果_dict[值]+=1
除KeyError外:
结果dict[值]=1
除了keyrerror,我为什么还要做其他事情?我不知道为什么会抛出KeyError。为什么我不能这么做

result_dict[value] += 1
首先

除了尝试/捕获之外,还有什么进入块内?我知道必须抛出错误,但是在except块内必须执行什么条件


对不起,如果我的问题太愚蠢了。我是初学者。

原因如下。你不能添加到没有的东西上。例如说
var1=None
。我不能做像
var=var+1
这样的事情。那会造成错误。在您共享的示例中,代码将检查您是否可以向值的键添加1。如果无法执行此操作,请为该键指定一个值

for i, value in enumerate(arr):
        try:
            #Try and add 1 to a dict key's value. 
            result_dict[value] += 1
        except KeyError:
            #Say we get an error we need to assign the dict key's value to 1.
            result_dict[value] = 1

原因如下。你不能添加到没有的东西上。例如说
var1=None
。我不能做像
var=var+1
这样的事情。那会造成错误。在您共享的示例中,代码将检查您是否可以向值的键添加1。如果无法执行此操作,请为该键指定一个值

for i, value in enumerate(arr):
        try:
            #Try and add 1 to a dict key's value. 
            result_dict[value] += 1
        except KeyError:
            #Say we get an error we need to assign the dict key's value to 1.
            result_dict[value] = 1

如果
result\u dict[value]
不存在,则
KeyError
将导致程序崩溃/终止。通过使用
except
块,您可以告诉程序在发生按键错误时应该做什么(这里,如果不存在
result\u dict[value]=1
),然后程序继续。基本上,你是在避免撞车

假设您的
值是
“香蕉”
。如果没有
结果_dict[“banana”]
,则不能将1添加为零,即
None+=1


通过使用除KeyError之外的
,您可以在错误停止程序之前拦截它,现在您已经为
结果dict
设置了一个键值对,而不是终止程序。

a
KeyError
将在
结果dict[value]
不存在时崩溃/终止您的程序。通过使用
except
块,您可以告诉程序在发生按键错误时应该做什么(这里,如果不存在
result\u dict[value]=1
),然后程序继续。基本上,你是在避免撞车

假设您的
值是
“香蕉”
。如果没有
结果_dict[“banana”]
,则不能将1添加为零,即
None+=1

通过使用除KeyError之外的
,您可以在错误停止程序之前拦截它,现在您已经为
结果设置了一个键值对,而不是终止程序。

TLDR
try/except
块确保程序继续运行而不是突然结束。通过包含除KeyError
之外的
,我们特别确保在发生
KeyError
时程序不会突然结束<如果
value
不是字典中的键,则code>result\u dict[value]+=1
将抛出错误,因为它试图访问不存在的键。
+=
使代码的运行方式类似于:

result_dict[value]=result_dict[value]+1
由于
value
不在result\u dict中,因此类似于

result_dict[value]=None+1
这很糟糕

非TLDR版本 当python中发生错误时,程序通常会突然终止并退出。它不会运行发生异常的部分下面的任何代码。例如,以下面的代码为例。它从用户
a
b
中提取2个数字,并输出
a/b

a=int(输入(“输入a:”)的值)
b=int(输入(“输入b:”)的值)
打印(“a/b为:”,a/b)
如果用户提供了有效的输入(例如
a=4,b=2
),程序将顺利进行。但是,如果用户要给出,比如说
a=“c”
,则会发生以下情况

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'c'
现在,我们从用户那里获取一个输入,尝试将其转换为整数,并将该值转换为
a
。如果成功,它将顺利进入下一行(
中断
)并退出循环。如果失败,则会发生异常,它将进入
异常
块,在该块中它将打印一条有用的错误消息,并再次运行循环(直到用户输入有效的输入)。现在,程序不会在失败时突然终止。它向用户提供适当的反馈,并允许用户再次重试输入

这是一个通用异常块,您可以在其中捕获任何异常

但是现在让我们说,可能会发生多个错误。以下面的代码为例:

a=input()
b=输入()
印刷(内部(a)/内部(b))
打印(“我完成了”)
现在可能会出现一些错误。其中之一是上面提到的
ValueError
,其中给定的输入不能转换为整数。另一个错误是
ZeroDivisionError
,其中
b=0
。Python不喜欢除以零,因此它会抛出异常并立即终止程序

现在,您需要为每种类型的程序打印一条特殊消息。如何做到这一点是通过捕获特定异常来实现的

a=input(“为a输入一个值:”)
b=输入(“输入b:”的值)
尝试:
印刷(内部(a)/内部(b))
除值错误外:
打印(“我们无法将非数字字符转换为整数”)
除零误差外:
打印(“我们不能除以0”)
除:
打印(“发生了一些意外错误”)
打印(“我完成了”)
如果python无法将输入转换为整数,它将输入代码的
ValueError
块,并打印
“我们无法将非数字字符转换为int
parking_spots["eve"]
result_dict = {}
for i, value in enumerate(arr):
    try:
        result_dict[value] += 1
    except KeyError:
        result_dict[value] = 1
result_dict = {}
result_dict.setdefault(0)

result_dict += 1
from collections import defaultdict

result_dict = defaultdict(int)
result_dict += 1