Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PyQt,SIP sipBadCatcherResult()
Форум на CrossPlatform.RU > Разработка > Интерпретируемые языки
Andrewshkovskii
PyQt - PyQt-Py2.7-x86-gpl-4.8.4-1.exe (SIP там вроде 4.12.1 вроде, но не могу сказать точно)
Собственно сабж , такой экспешен райситься после таких вещей:
виджету подменяется метод contextMenuEvent на следующую функцию:
def create_context_menu(self,menu):
   return lambda event : menu.exec_(event.globalPos())


widget.contextMenuEvent=create_context_menu(cmWrapper([{'action_title':action_handler}]))

Что делает этот код? В он заменяет ивен вызова контекстного меню на кастомное меню, которое создается путем задания конфига (хэш в __init__ у cmWrapper).
Эксепшен прилетает после отработки хэндлера экшена. Код отрабатывается, приложение не крашиться. Просто хотелось бы понять, откуда эксепшен летит и почему.

Для чего это нужно - что бы не писать методы создания менюшек для каждого виджета, а использовать так - как показано.

все это добро прилетает вот отсюда (исходники последнего sip)
/*
* Report a Python member function with an unexpected return type.
*/
static void sip_api_bad_catcher_result(PyObject *method)
{
    PyObject *mname;

    /*
     * This is part of the public API so we make no assumptions about the
     * method object.
     */
    if (!PyMethod_Check(method) ||
        PyMethod_GET_FUNCTION(method) == NULL ||
        !PyFunction_Check(PyMethod_GET_FUNCTION(method)) ||
        PyMethod_GET_SELF(method) == NULL)
    {
        PyErr_Format(PyExc_TypeError,
                "invalid argument to sipBadCatcherResult()");
        return;
    }

    mname = ((PyFunctionObject *)PyMethod_GET_FUNCTION(method))->func_name;

#if PY_MAJOR_VERSION >= 3
    PyErr_Format(PyExc_TypeError, "invalid result type from %s.%U()",
            Py_TYPE(PyMethod_GET_SELF(method))->tp_name, mname);
#else
    PyErr_Format(PyExc_TypeError, "invalid result type from %s.%s()",
            Py_TYPE(PyMethod_GET_SELF(method))->tp_name,
            PyString_AsString(mname));
#endif
}


мне кажется тут 2 пути решения -
1. Проверить - жива ли функция которая вернулась лямбдой после отработки хэндлера.
2 Собрать свежий SIP и PyQt и попробовать.
Больше у меня мыслей, пока, нет.
ViGOur
Ну так если ты знаешь, что есть эксцепшин, то можешь и размотать его стек и посмотреть откуда он был отправлен, а там уже потихоньку подебажить... Есть для Python такая хорошая штука как pdb, аналог С\С++ gdb. В нем и попробуй отладить...
Andrewshkovskii
Нашел доку на эксепшен..
Цитата
void sipBadCatcherResult(PyObject *method)¶

This raises a Python exception when the result of a Python reimplementation of a C++ method doesn’t have the expected type. It is normally called by handwritten code specified with the %VirtualCatcherCode directive.
Parameter: method – the Python method and would normally be the supplied sipMethod.


да в том то и дело, что он трейс мне не кидает, и вообще не понятно откуда вызывается, т.е. я его отловить руками не могу . Попробую Pdb завтра..может что покажет :)
ViGOur
Но тебе как я понимаю нужна будет тогда связка pdb c gdb, даже и не знаю можно их в связке попользовать... :)
Andrewshkovskii
пррр..да уш, ситуация.
Кто-нибудь знает, чем плох не отловленный экспепшен? Утечек то вроде не будет, и программа не крашится , а то что это не эстетично и идеологически не верно(оставлять эксепшен просто так валяться) - это факт.
ViGOur
Цитата(Andrewshkovskii @ 6.7.2011, 22:38) *
Кто-нибудь знает, чем плох не отловленный экспепшен?
Экспепшен, это по сути своей ошибка - не правильная работы приложения. А оставлять его или нет, это решать только программеру! :)
Andrewshkovskii
Решил проблемы путем возврата не лямбды а объекта функции. А так хотелось лямбду..ну что поделаешь:)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.