Область объекта исключения в C ++

Это мое решение обтекающего потокового тела:

import io
class S3ObjectInterator(io.RawIOBase):
    def __init__(self, bucket, key):
        """Initialize with S3 bucket and key names"""
        self.s3c = boto3.client('s3')
        self.obj_stream = self.s3c.get_object(Bucket=bucket, Key=key)['Body']

    def read(self, n=-1):
        """Read from the stream"""
        return self.obj_stream.read() if n == -1 else self.obj_stream.read(n)

Пример использования:

obj_stream = S3ObjectInterator(bucket, key)
for line in obj_stream:
    print line
37
задан Naveen 31 October 2009 в 11:41
поделиться

3 ответа

Когда вычисляется выражение throw , объект исключения инициализируется из значения выражения. Выброшенный объект исключения получает свой тип из статического типа выражения throw, игнорируя любые квалификаторы const и volatile . Для типов классов это означает, что выполняется инициализация копирования .

Область действия объекта исключения находится за пределами области действия блока, в котором происходит выброс. Думайте об этом как о пребывании в специальной области исключений в стороне от обычного стека вызовов, где находятся локальные объекты.

Внутри блока catch имя, инициализированное перехваченным объектом исключения, инициализируется этим объект исключения, а не аргумент throw , даже если это было lvalue.

Если вы поймаете через неконстантную ссылку, то вы можете изменить объект исключения, но не то, из чего он был инициализирован. Вы можете изменить поведение программы, если повторно сгенерируете исключение способами, которые нельзя было бы сделать, если бы вы перехватили значение или ссылку на константу (не считая const_cast s).

Объект исключения уничтожен когда завершается последний блок catch, который не завершился с помощью повторного выброса (т.е. оценка выражения выброса без параметров).

37
ответ дан 27 November 2019 в 03:48
поделиться

Объект исключения доступен только в блоке catch . Вы не можете использовать объект исключения вне блока catch . Следующие шаги происходят, когда вы генерируете исключение и перехватываете:

try
{
 MyException anObject;
 throw anObject;  //1

}
catch(MyException exObject)
{
}
  • Предложение throw (// 1) получает локальный объект anObject и рассматривает его как аргумент значения: создает копию anObject .
  • обработчик catch перехватывает объект MyException, который снова является параметром значения. В этот момент создается еще одна копия.
  • Если бы обработчик catch был бы реализован так, чтобы получать ссылку на объект (catch (MyException & o)) , вторая копия избегается.
  • если обработчик catch получает объект исключения с помощью const & , то вы можете вызывать только методы const .
9
ответ дан 27 November 2019 в 03:48
поделиться

Во-первых, бросаемый вами объект почти сразу выходит из поля зрения. Обработчики исключений будут перехватывать копию исходного объекта. Эта копия будет удалена после выполнения обработчика catch , если вы не поймаете ее по значению (а не по ссылке). В этом случае будет создана другая копия. Но вы все равно должны поймать его по ссылке (желательно с константой).

4
ответ дан 27 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: