正确处理Python中的异常并退出类执行

时间:2015-06-29 02:24:58

标签: python

如何处理内部类执行错误?返回一些东西,以便外部函数知道并使用其他数据调用该类。在Python中执行此操作的正确方法是什么?

我知道我们可以通过执行以下操作来处理所有异常:

import sys
try: 
    do_something()
except Exception:
    do_something_else()
    system.exit('Something happened')

并且“system.exit('Something happened')”行将退出Python。 问题是我有一个类,有三个方法加上__init__()方法。共有四种方法或功能。我有一个函数,使用不同的值调用此,并且该类执行其操作。我没有在课堂上进行任何异常处理,因为我不知道该怎么做。 这是我班级的样子。

class myClass:
   def __init__(self, values, more values):
      config = []
      answer = self.first_method(values)
      if answer == True:
         self.third_method(values, more_values, answer)
   def first_method(values):
      my_tuple = self.second_method(values)
      return my_tuple
   def second_method(values)
      do_stuff
      return stuff
   def third_method(values, more_values, answer):
      do_stuff...

外部功能看起来像:

from my myclass import myClass
def my_function():
    count = 0
    more_values = [6,7,8,9,10]
    list_of_values = [1,2,3,4,5]
    for values in list_of_values:
        myClass(values, more_values)
        count += 1

我需要的是,如果first_method()second_method()third_method()中发生了某些事情。我将需要停止该类并返回一些内容,以便外部函数将我知道这个课已经被某些东西拦住了,然后跳过那个并尝试下一个。我能说清楚吗? 我没有显示我的类中的代码,因为我仍在处理类本身以及外部函数。但那是主要的想法。

可能很重要的东西:我正在尝试执行的是创建一些图像,我正在使用PIL。我一直在导入以下内容:

from PIL import Image, ImageFont, ImageOps, ImageDraw

2 个答案:

答案 0 :(得分:0)

根据我关于避免你不真正需要的课程的评论,尝试这样做:

def start(values, more values):
   config = []
   answer = runfirst(values)
   if answer == True:
      runthird(values, more_values, answer)

def runfirst(values):
   my_tuple = runsecond(values)
   return my_tuple

def runsecond(values):
   do_stuff
   return stuff

def runthird(values, more_values, answer):
   do_stuff...

然后,在你的"外面"功能:

from myfunctions import start
def my_function():
    count = 0
    more_values = [6,7,8,9,10]
    list_of_values = [1,2,3,4,5]
    for values in list_of_values:
        try:
            start(values, more_values)
        except (ValueError, IndexError) as exc:
            print("Houston, we've had a problem:", exc)
            continue
        count += 1

没有必要的课程:你所有的第一,第二和第三个功能都整齐地存放在他们自己的模块中,并且不需要上课。

注意:永远不要使用通用except Exception捕获每个异常。捕获特定的例外情况。因为总有一个例外你忽略了,你真的想要一路冒出来。

答案 1 :(得分:0)

您可以使用"尝试","除了"和"引发"在一起:尝试内部函数的东西,如果它导致异常,用" raise"将它抛出到外部函数,然后在外部函数上尝试调用第一个函数,如果它引发异常移动到第二个函数一个等等。

您的代码,类和函数非常混乱,因此我会尝试做出更通用的答案(您需要自己处理 init 函数)

class myClass:
   def __init__(self, values, more_values):
      config = []
      """answer = self.first_method(values)
      if answer == True:
         self.third_method(values, more_values, answer)"""
   def first_method(self, values):
      print "executing first function"
      try:
          stuff = "stuff"
          #my_tuple = self.second_method(values)
          x = 5/0 #causing an exception
          return stuff
      except Exception as e:
          raise(e)
   def second_method(self, values):
      print "executing second function"
      try:
          #do_stuff
          stuff = "stuff"
          x = 5/0 #causing an exception
          return stuff
      except Exception as e:
          raise(e)
   def third_method(self, values, more_values, answer):
       print "executing third function"
       try:
           #do_stuff...
           stuff = "stuff"
           x = 5/0 #causing an exception
           return stuff
       except Exception as e:
           raise(e)

外部功能:

def my_function():
    count = 0
    more_values = [6,7,8,9,10]
    list_of_values = [1,2,3,4,5]
    #for values in list_of_values:
    if(1 == 1):
        mc = myClass(values, more_values)
        #count += 1
        try:
            mc.first_method(values)
        except Exception as e:
            try:
                mc.second_method(values)
            except Exception as e:
                try:
                    mc.third_method(values, more_values, "answer")
                except Exception as e:
                    print "My three functions have failed :-("