Обработка ошибок / исключений в цикле - python - PullRequest
0 голосов
/ 05 июля 2018

Я использую API Google Cloud NL для анализа настроений некоторых описаний. Что касается некоторых строк, ошибка InvalidArgument: 400 The language vi is not supported for document_sentiment analysis. продолжает появляться, я хотел бы обойти это, вместо того, чтобы отчаянно пытаться найти причину, по которой это происходит, и удалить ответственные строки. К сожалению, я относительно новичок в Python и не уверен, как правильно это сделать.

Мой код следующий:

description_list = []
sentimentscore_list=[]
magnitude_list=[]

# Create a Language client
language_client = google.cloud.language.LanguageServiceClient()


for i in range(len(description)):      # use the translated description if the original description is not in English
    if description_trans[i] == '':
        descr = description[i]
    else:
        descr = description_trans[i]


    document = google.cloud.language.types.Document(
        content=descr,
        type=google.cloud.language.enums.Document.Type.PLAIN_TEXT)

    # Use Language to detect the sentiment of the text.
    response = language_client.analyze_sentiment(document=document)
    sentiment = response.document_sentiment
    sentimentscore_list.append(sentiment.score)
    magnitude_list.append(sentiment.magnitude)
    # Add the description that was actually used to the description list
    description_list.append(descr)

Может ли кто-нибудь объяснить мне, как обернуть это для цикла for (или, возможно, последней части достаточно) в обработку ошибок / исключений, чтобы он просто «пропускал» тот, который не может прочитать, и продолжал с следующий? Также я хочу, чтобы 'description_list' добавлялся только тогда, когда описание фактически проанализировано (не когда оно застревает в обработке ошибок).

Любая помощь очень ценится! Спасибо:)


Редактировать: мне было предложено более полное отслеживание ошибок:

Traceback (последний последний вызов):

  File "<ipython-input-64-6e3db1d976c9>", line 1, in <module>
    runfile('/Users/repos/NLPAnalysis/GoogleTest.py', wdir='/Users/repos/NLPAnalysis')

  File "/Users/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 710, in runfile
    execfile(filename, namespace)

  File "/Users/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 101, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/Users/repos/NLPAnalysis/GoogleTest.py", line 45, in <module>
    response = language_client.analyze_sentiment(document=document)

  File "/Users/anaconda3/lib/python3.6/site-packages/google/cloud/language_v1/gapic/language_service_client.py", line 180, in analyze_sentiment
    return self._analyze_sentiment(request, retry=retry, timeout=timeout)

  File "/Users/anaconda3/lib/python3.6/site-packages/google/api_core/gapic_v1/method.py", line 139, in __call__
    return wrapped_func(*args, **kwargs)

  File "/Users/anaconda3/lib/python3.6/site-packages/google/api_core/retry.py", line 260, in retry_wrapped_func
    on_error=on_error,

  File "/Users/anaconda3/lib/python3.6/site-packages/google/api_core/retry.py", line 177, in retry_target
    return target()

  File "/Users/anaconda3/lib/python3.6/site-packages/google/api_core/timeout.py", line 206, in func_with_timeout
    return func(*args, **kwargs)

  File "/Users/anaconda3/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 56, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)

  File "<string>", line 3, in raise_from

InvalidArgument: 400 The language vi is not supported for document_sentiment analysis.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я согласен с ThatBird, что завершение слишком большого количества кода в блоке try может усложнить отладку внутренних ошибок. Я бы предложил использовать ключевое слово python continue .

try:
    # smallest block of code you foresee an error in
    response = language_client.analyze_sentiment(document=document) # I think your exception is being raised in this call
except InvalidArgument as e:
    # your trace shows InvalidArgument being raised and it appears you dont care about it
    continue # continue to next iteration since this error is expected
except SomeOtherOkayException as e:
    # this is an example exception that is also OK and "skippable"
    continue # continue to next iteration
except Exception as e:
    # all other exceptions are BAD and unexpected.This is a larger problem than just this loop
    raise e # break the looping and raise to calling function

sentiment = response.document_sentiment
sentimentscore_list.append(sentiment.score)
magnitude_list.append(sentiment.magnitude)
# Add the description that was actually used to the description list
description_list.append(descr)
# more code here...

По сути, вы явно перехватываете ожидаемые исключения и отбрасываете эту итерацию, если она происходит, и переходите к следующей. Вы должны поднять все другие исключения, которые не ожидаются.

0 голосов
/ 05 июля 2018

В трассировке взгляните на четвертую строку, это та же строка, которая есть в вашем коде и вызывает исключение. Мы всегда ставим try, за исключением блока кода, который, по нашему мнению, вызовет исключение. Все остальное ставится вне блока.

try:
    response = language_client.analyze_sentiment(document=document)
except InvalidArgument:
    continue
# Assuming none of these would work if we don't get response?
description_list.append(descr)
sentiment = response.document_sentiment
entimentscore_list.append(sentiment.score)
magnitude_list.append(sentiment.magnitude)
# Add the description that was actually used to the description list

Мы пытаемся получить ответ от языкового клиента, возникает исключение, говорящее InvalidArgument , мы его ловим. Теперь мы знаем, что нам ничего не нужно делать, и мы используем continue и переходим к следующей итерации.

Возможно, вам нужно будет импортировать InvalidArgument как -

from google.api_core.exceptions import InvalidArgument

перед использованием в коде.

Вы правы насчет продолжить . Подробнее о операторах continue и о том, как обрабатывать исключения в python .

...