假设我有以下自定义异常。
begin
attempts ||= 0
query_one = GoogleSearchResults.new num: "1", q: "#{invite.invitee.name} + #{invite.invitee.guest_company}"
rescue OpenURI::HttpError
if (attempts += 1) <= 1
sleep 1
retry
end
end
python如何知道何时在以下代码中捕获我的异常?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int global[9];
void *sum_thread(void *arg)
{
int *args_array;
args_array = arg;
int n1,n2,sum;
n1=args_array[0];
n2=args_array[1];
sum = n1*n2;
printf("N1 * N2 = %d\n",sum);
return (void*) sum;
}
void *sum_thread1(void *arg)
{
int *args_array;
args_array = arg;
int n3,n4,sum2;
n3=args_array[2];
n4=args_array[3];
sum2=n3*n4;
printf("N3 * N4 = %d\n",sum2);
return (void*) sum2;
}
void *sum_thread2(void *arg)
{
int *args_array;
args_array = arg;
int n5,n6,sum3;
n5=args_array[4];
n6=args_array[5];
sum3=n5*n6;
printf("N5 * N6 = %d\n",sum3);
return (void*) sum3;
}
void *sum_thread3(void *arg)
{
int *args_array;
args_array = arg;
int n8,n7,sum4;
n7=args_array[6];
n8=args_array[7];
sum4=n7*n8;
printf("N7 * N8 = %d\n",sum4);
return (void*) sum4;
}
int main()
{
int sum3,sum2,sum,sum4;
int prod;
global[0]=9220; global[1]=1110; global[2]=1120; global[3]=2320; global[4]=5100; global[5]=6720; global[6]=7800; global[7]=9290;// the input
pthread_t tid_sum;
pthread_create(&tid_sum,NULL,sum_thread,global);
pthread_join(tid_sum,(void*)&sum);
pthread_t tid_sum1;
pthread_create(&tid_sum1,NULL,sum_thread1,global);
pthread_join(tid_sum1,(void*)&sum2);
pthread_t tid_sum2;
pthread_create(&tid_sum2,NULL,sum_thread2,global);
pthread_join(tid_sum2,(void*)&sum3);
pthread_t tid_sum3;
pthread_create(&tid_sum3,NULL,sum_thread3,global);
pthread_join(tid_sum3,(void*)&sum4);
prod=sum+sum2+sum3+sum4;
printf("The sum of the products is: %d", prod);
return 0;
}
当我实现class CustomException(TypeError):
def __init__(message, code):
super().__init__(f'{code}: message')
self.code = code
函数时,是否必须显式抛出try:
x = doSomething(a, b, c)
except CustomException:
raise
才能使其被捕获?就像,对于内置的异常类,代码可以引发类似KeyError的异常,并且我们在使用字典进行操作时不必显式地说出doSomething()
。
答案 0 :(得分:1)
任何引发异常的代码都明确地这样做,包括F5
。与内置类型相比,自定义异常不需要特殊处理。如果KeyError
内任何语句执行的代码引发了try...except
,则只能捕获一个异常。这包括任何其他函数调用,这些调用链接在一起成为一个调用堆栈。
在以下示例中
try
>>> d = {}
>>> d['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'foo'
并非一无是处,Python KeyError
实现显式地引发了该异常。这可能并不总是很明显,因为本机代码(此处是用C实现的代码)没有显示在Python追溯中。
对于dict
订阅操作,dict_subscript()
function调用_PyErr_SetKeyError(key);
,这是一个辅助函数,它使用PyErr_SetObject()
(相当于d[...]
的C来提高{{ 1}}例外。
捕获异常对所有异常类型都相同,自定义异常在此并不特殊。引发异常时,正常的代码流被中断,并取消展开堆栈,直到遇到活动的raise
语句为止,然后按照源代码中的定义顺序使用{{1 }}。
如果什么都没有捕获到异常,Python会继续展开调用栈,直到到达最后一个堆栈帧为止,这时如果没有任何异常捕获到Python,Python将以堆栈跟踪退出。