python如何在块例外情况下捕获自定义异常?

时间:2018-11-29 15:50:50

标签: python exception exception-handling

假设我有以下自定义异常。

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()

1 个答案:

答案 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将以堆栈跟踪退出。