Как мне правильно перехватывать исключения pySVN?

#python #svn #pysvn

#python #svn #pysvn

Вопрос:

У меня есть функция, которая подключается к базе данных SVN и извлекает папку / файл. При вводе правильной информации для входа все происходит так, как должно. Однако при вводе неправильной информации для входа в систему pysvn создает исключение и завершается сбоем. Я пытаюсь перехватить и обработать ошибку, но, похоже, не могу ее правильно перехватить:

Код (при условии, что ‘svnlogin’ содержит информацию о мусоре):

 def connect_and_checkout():
    client = pysvn.Client()
    client.callback_get_login = svnlogin

    try:
        client.checkout(svnurl(),
        './examples/pysvn')

    except (pysvn.ClientError) as e:
        print("error during svn command", e)    
  

Ожидаемый результат:

 error during svn command, 'error'
  

Фактический вывод (сбой программы):

 svn: E235000: In file 'c:buildrootwin64-vc-14.1-1.14.0subversion-1.14.0subversionlibsvn_clientcheckout.c' line 88: assertion failed (svn_uri_is_canonical(url, scratch_pool))
  

Помимо «pysvn.ClientError» в качестве параметра исключения я также пробовал «svn», «pysvn.svn», «AssertionError», «SvnException» и просто пустое «except:». Ни один из них, похоже, не правильно перехватил исключение и не позволил мне его обработать.

Ответ №1:

Оказывается, это ошибка в pySVN и, по словам разработчика Барри Скотта, она будет исправлена в редакции 2047. Смотрите следующий отчет об ошибке для получения дополнительной информации

Ошибка возникает, когда базовый SVN-соединитель обнаруживает недопустимый URL, например, из-за неправильного пользовательского ввода. Ошибка не возникает, если сам URL-адрес действителен, но соединение не удается.

Тем временем либо выполните некоторую проверку ввода, которая проверяет, присутствует ли «www.» и т.д., Либо используйте следующий фрагмент, чтобы вручную вызвать исключение, которое можно обработать:

 c = pysvn.Client()
if not c.is_url( url_candicate ):
    raise AttributeError( 'bad url' )