【问题标题】:How to raise exception inside an exception without the traceback?如何在没有回溯的情况下在异常中引发异常?
【发布时间】:2021-12-26 23:09:54
【问题描述】:

我试图在异常内部引发异常,但没有收到外部异常和回溯的错误消息,只打印嘿。但是,如果我放一个字符串而不是 k 或 m,我会被困在这里。有什么想法吗?

The output, which I would need without the traceback

def division(k, m):
   try:
       k / m
   except TypeError:
       raise ValueError ('hey') from None
   return k / m

【问题讨论】:

标签: python exception


【解决方案1】:

目前尚不完全清楚您要在这里实现什么。您不会收到错误消息,因为您引发了异常,但因为您没有再次捕获它。如果您不想要错误消息,则需要捕获异常。然后,如果您只想打印消息“嘿”,您可以从异常 args 中获取它。

try:
    division('a', 2)
except ValueError as e:
    print(e.args[0])

raise ... from None 已经摆脱了第一个异常,所以你只会看到你在except 块中引发的ValueError division,但是如果出现异常,它就会一直出现在命令中行,必须以某种方式通知您,Python 将通过打印错误消息来做到这一点。

现在,您可以根据需要更改未捕获异常的默认行为。例如,这将为您未明确捕获的所有异常打印args[0]

import sys
def handle_exception(exc_type, exc_value, exc_traceback):
    print('handler:', exc_value.args[0])
sys.excepthook = handle_exception

sys.excepthook 是 Python 会为未捕获的异常调用的函数。所以如果你这样做了

try:
    division('a', 2)
except ValueError as e:
    print('caught:', e)

division('a', 2)  # not caught

第一个除法异常被捕获,处理程序没有被调用,第二个没有被捕获并且处理程序被使用(并且只会打印消息'hey')。

不过,改变所有未捕获异常的处理方式并不是一个好主意。您可能只想处理自己的行为,并将默认行为用于其他任何事情。

但是,正如我所说,我并不完全清楚您要达到的目标,因此上述所有内容可能与问题完全无关。

【讨论】:

    【解决方案2】:

    据我了解,您需要具有自定义消息格式的自定义异常。

    class CustomException(Exception):
        def __init__(self, message):
            self.message = message # You can also set it by default so you don't need to input any message
            super().__init__(self.message)
    
        def __eq__(self, other):
            return self.message == other.message
    
        def __str__(self):
            return f'{self.message}' # In your case, just to display message.
            # return f'Error message: {self.message}'
    
    def division(k, m):
       try:
           k / m
       except TypeError:
           raise CustomException(message="hey")
       return k / m
    
    try:
        division("not_an_int", "could_be_an_int")
    except ValueError as e:
        print(e)
    
    

    【讨论】:

      【解决方案3】:

      我不完全确定你想在这里实现什么,但你为什么不在引发 TypeError 时打印字符串“hey”?像这样:

      def division(k, m):
         try:
             k / m
         except TypeError:
             print("hey")
             return None
         return k / m
      

      如果您出于任何原因需要引发 ValueError,那么您可以在调用该方法的地方捕获 ValueError,我猜:

      def division(k, m):
         try:
             k / m
         except TypeError:
             raise ValueError
         return k / m
      
      try:
          division("not_an_int", "could_be_an_int")
      except ValueError:
          print("hey")
      

      【讨论】:

        猜你喜欢
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 2017-09-03
        • 2022-08-19
        • 2017-01-12
        • 1970-01-01
        相关资源
        最近更新 更多