Agrupando todas as chamadas de método possíveis de uma classe em um bloco try / except

Estou tentando agrupar todos os métodos de uma classe existente (não da minha criação) em um conjunto try / except. Pode ser qualquer classe, mas usarei opandas.DataFrame classe aqui como um exemplo prático.

Portanto, se o método invocado for bem-sucedido, simplesmente seguiremos em frente. Porém, se gerar uma exceção, ela será anexada a uma lista para inspeção / descoberta posterior (embora o exemplo abaixo apenas emita uma declaração de impressão por simplicidade).

(Observe que os tipos de exceções relacionadas a dados que podem ocorrer quando um método na instância é chamado ainda não são conhecidos; e esse é o motivo desse exercício: descoberta).

estepostar foi bastante útil (particularmente a resposta do @martineau Python-3), mas estou tendo problemas para adaptá-lo. Abaixo, eu esperava a segunda chamada para o (embrulhado)info () método para emitir saída de impressão, mas, infelizmente, isso não ocorre.

#!/usr/bin/env python3

import functools, types, pandas

def method_wrapper(method):
    @functools.wraps(method)
    def wrapper(*args, **kwargs): #Note: args[0] points to 'self'.
        try:
            print('Calling: {}.{}()... '.format(args[0].__class__.__name__,
                                      ,          method.__name__))
            return method(*args, **kwargs)
        except Exception:
            print('Exception: %r' % sys.exc_info()) # Something trivial.
            #<Actual code would append that exception info to a list>.
    return wrapper


class MetaClass(type):
    def __new__(mcs, class_name, base_classes, classDict):
        newClassDict = {}
        for attributeName, attribute in classDict.items():
            if type(attribute) == types.FunctionType: # Replace it with a
                attribute = method_wrapper(attribute) # decorated version.
            newClassDict[attributeName] = attribute
        return type.__new__(mcs, class_name, base_classes, newClassDict)

class WrappedDataFrame2(MetaClass('WrappedDataFrame',
                                  (pandas.DataFrame, object,), {}),
                                  metaclass=type):
    pass

print('Unwrapped pandas.DataFrame().info():')
pandas.DataFrame().info()

print('\n\nWrapped pandas.DataFrame().info():')
WrappedDataFrame2().info()
print()

Isso gera:

Unwrapped pandas.DataFrame().info():
<class 'pandas.core.frame.DataFrame'>
Index: 0 entries
Empty DataFrame

Wrapped pandas.DataFrame().info():   <-- Missing print statement after this line.
<class '__main__.WrappedDataFrame2'>
Index: 0 entries
Empty WrappedDataFrame2

Em suma,...

>>> unwrapped_object.someMethod(...)
# Should be mirrored by ...

>>> wrapping_object.someMethod(...)
# Including signature, docstring, etc. (i.e. all attributes); except that it
# executes inside a try/except suite (so I can catch exceptions generically).

questionAnswers(2)

yourAnswerToTheQuestion