Как исключение C++ обрабатывает реализованное время выполнения?

Обновление:

С текущими версиями вы можете использовать array литералов:

from pyspark.sql.functions import array, lit

df.where(df.a == array(*[lit(x) for x in ['list','of' , 'stuff']]))

Оригинальный ответ:

Ну, немного хакерский способ сделать это, который не требует пакетного задания Python, выглядит примерно так:

from pyspark.sql.functions import col, lit, size
from functools import reduce
from operator import and_

def array_equal(c, an_array):
    same_size = size(c) == len(an_array)  # Check if the same size
    # Check if all items equal
    same_items = reduce(
        and_, 
        (c.getItem(i) == an_array[i] for i in range(len(an_array)))
    )
    return and_(same_size, same_items)

Быстрая проверка:

df = sc.parallelize([
    (1, ['list','of' , 'stuff']),
    (2, ['foo', 'bar']),
    (3, ['foobar']),
    (4, ['list','of' , 'stuff', 'and', 'foo']),
    (5, ['a', 'list','of' , 'stuff']),
]).toDF(['id', 'a'])

df.where(array_equal(col('a'), ['list','of' , 'stuff'])).show()
## +---+-----------------+
## | id|                a|
## +---+-----------------+
## |  1|[list, of, stuff]|
## +---+-----------------+
79
задан Shog9 16 June 2009 в 16:23
поделиться

3 ответа

Реализации могут отличаться, но существуют некоторые основные идеи, которые следуют из требований.

сам объект исключения является объектом, созданным в одной функции, уничтоженной в вызывающей стороне этого. Следовательно, обычно не выполнимо создать объект на стеке. С другой стороны, много объектов исключения не являются очень большими. Следовательно, можно создать, например, 32-байтовый буфер и переполнение к "куче", если больший объект исключения на самом деле необходим.

Что касается фактической передачи управления, две стратегии существуют. Нужно записать достаточно информации в самом стеке для раскручивания стека. Это - в основном список деструкторов для выполнения и обработчики исключений, которые могли бы поймать исключение. Когда исключение происходит, отбегите стек, выполняющий те деструкторы, пока Вы не находите выгоду соответствия.

вторая стратегия перемещает эту информацию в таблицы вне стека. Теперь, когда исключение происходит, стек вызовов используется для обнаружения, какие объемы введены, но не выходятся. Они затем ищутся в статических таблицах для определения, где вызванная исключительная ситуация будет обработана, и который деструкторы, выполненные промежуточный. Это означает, что существует меньше исключения наверху на стеке; обратные адреса необходимы так или иначе. Таблицы являются дополнительными данными, но компилятор может поместить их в загруженный спросом сегмент программы.

43
ответ дан MSalters 24 November 2019 в 10:19
поделиться

Это определяется в 15.1 Выдаче исключения стандарта.

бросок создает временный объект.
то, Как память для этого временного объекта выделяется, является неуказанным.

После того, как создание управления временным объектом передается самому близкому обработчику в стеке вызовов. раскручивание стека между броском и точкой выгоды. Поскольку стек, раскручиваются, любые переменные стека уничтожаются в обратном порядке создания.

, Если исключение не повторно брошено, временный файл уничтожается в конце обработчика, где это было поймано.

Примечание: Если Вы поймаете ссылкой, то ссылка будет относиться к временному файлу, Если Вы поймаете значением, временный объект копируется в значение (и таким образом требует конструктора копии).

Совет от S.Meyers (Выгода ссылкой константы).

try
{
    // do stuff
}
catch(MyException const& x)
{
}
catch(std::exception const& x)
{
}
18
ответ дан Martin York 24 November 2019 в 10:19
поделиться

Вы могли смотреть здесь для подробного объяснения.

Это может также помочь смотреть на прием, используемый в плоскости C для реализации некоторого основного вида обработки исключений. Это влечет за собой использование setjmp () и longjmp () следующим образом: первый сохраняет стек для маркировки обработчика исключений (как "выгода"), в то время как последний используется для "бросания" значения. "Брошенное" значение замечено, как будто оно было возвращено из вызванной функции. "Блок попытки" заканчивается, когда setjmp () называют снова или когда функция возвращается.

12
ответ дан Eduard - Gabriel Munteanu 24 November 2019 в 10:19
поделиться
Другие вопросы по тегам:

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