crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> PyQt,SIP sipBadCatcherResult(), TypeError: invalid argument to sipBadCatcherResult()
Andrewshkovskii
  опции профиля:
сообщение 6.7.2011, 20:51
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


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
  опции профиля:
сообщение 6.7.2011, 21:31
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну так если ты знаешь, что есть эксцепшин, то можешь и размотать его стек и посмотреть откуда он был отправлен, а там уже потихоньку подебажить... Есть для Python такая хорошая штука как pdb, аналог С\С++ gdb. В нем и попробуй отладить...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 6.7.2011, 21:33
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Нашел доку на эксепшен..
Цитата
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
  опции профиля:
сообщение 6.7.2011, 21:35
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Но тебе как я понимаю нужна будет тогда связка pdb c gdb, даже и не знаю можно их в связке попользовать... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 6.7.2011, 21:38
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


пррр..да уш, ситуация.
Кто-нибудь знает, чем плох не отловленный экспепшен? Утечек то вроде не будет, и программа не крашится , а то что это не эстетично и идеологически не верно(оставлять эксепшен просто так валяться) - это факт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 6.7.2011, 21:40
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Andrewshkovskii @ 6.7.2011, 22:38) *
Кто-нибудь знает, чем плох не отловленный экспепшен?
Экспепшен, это по сути своей ошибка - не правильная работы приложения. А оставлять его или нет, это решать только программеру! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 7.7.2011, 13:29
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Решил проблемы путем возврата не лямбды а объекта функции. А так хотелось лямбду..ну что поделаешь:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.2.2025, 1:40