Как вызвать ошибку при выполнении действий в ADFV2?

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

Сначала этот дочерний конвейер проверяет наличие файла с помощью действия Get Metadata в исходной папке. Затем он выполняет дочерний конвейер для обработки данных, если один или несколько дочерних элементов возвращаются из GetMetaData.

В контрольном наборе данных также есть обязательное поле Y / N, означающее, что я могу игнорировать ошибку, если папка или файл не существует.

Если папка не существует, GetMEtadata завершится ошибкой. Если он существует, но нет файлов, я получаю 0 дочерних элементов. Таким образом, при отсутствии файла или папки происходят 2 разные вещи (ошибка или 0 элементов).

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

Однако я не могу найти способ вызвать ошибку. Не менее важно, существует ли альтернативный подход, который лучше подошел бы или лучше подошел бы для ADF V2?

Большое спасибо, Марк.


person MarkD    schedule 15.10.2018    source источник


Ответы (5)


У меня аналогичный сценарий, и я справляюсь с этим с помощью SqlStoreProcedure.

"storedProcedureName": "sp_executesql", "storedProcedureParameters": { "stmt": { "value": "Declare @err_msg NVARCHAR(150)SET @err_msg=N'Error occurred in this pipeline somehow somewhere something. Best regards. EXISTSCheers'RAISERROR(@err_msg,15,1)", "type": "string" } }

StoredProcedureName: sp_executesql

Параметр StoredProcedureParameter: stmt

value: Declare @err_msg NVARCHAR (150) SET @ err_msg = N'Error произошла в этом конвейере как-то где-то что-то. С наилучшими пожеланиями. EXISTSCheers'RAISERROR (@ err_msg, 15,1) (конечно, вы можете изменить текст ошибки :)

тип: строка

Надеюсь это поможет

person DraganB    schedule 16.10.2018
comment
Спасибо - я также подумал о вызове функции azure, которая возвращает 500. Для этого требуется соединение sql, и любые ошибки соединения sql вызовут «бросок в пределах броска». Тем не менее, если у нас есть соединение sql, это предложение - простой обходной путь, и я отмечу его как ответ. n.b. Я добавил голоса и комментарий к этой заявке User Voice, чтобы помочь поднять ее в отставании по продукту. feedback.azure.com/forums/270578- фабрика данных / предложения /. - person MarkD; 16.10.2018
comment
Да, конечно, это только обходной путь. Кроме того, если вы работаете с ADLA, вы можете создать исключение. Мне не известно о каком-либо общем способе решения этой проблемы, и он нам нужен, поэтому я также буду поддерживать этот отзыв. Ваше здоровье. :) - person DraganB; 16.10.2018

Для этого я использую задачу Set Variable Task.

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

"name": "Throw Error",
"description": "You can't throw an error in DF so I try to divide by zero. :)",
"type": "SetVariable",
"dependsOn": [],
"userProperties": [],
"typeProperties": {
   "variableName": "ThrowError",
   "value": {
      "value": "@div(1,0)",
      "type": "Expression"
   }
}
person Chris Hume    schedule 28.09.2019
comment
Интересный подход. Преимущество принятого ответа заключается в том, что вы можете написать некоторую информацию, которая будет записана в журнал. Я думаю, что в этом решении все сводится к тому, как вы называете переменную. Тем не менее, это простой обход отсутствующей функции. - person MarkD; 02.10.2019

Решение, которое я использую, - создать фиктивный API в API Management, который возвращает HTTP-код 500 вместе с сообщением об ошибке. Более подробную информацию о том, как это сделать, можно найти здесь: https://docs.microsoft.com/en-us/azure/api-management/mock-api-responses.

Изнутри конвейера ADF я вызываю этот фиктивный API, используя веб-активность, передавая сообщение об ошибке.

Затем я вижу сбойный конвейер с ожидаемой ошибкой.

person Thuc Nguyen    schedule 05.03.2020

Я использую веб-активность и ПОЛУЧАЮ несуществующий URL: www.notreal-nvlsuifhg9348h4932.com.

(Хотя мне нравится вариант Криса Хьюма Set 1/0. Могу украсть это;))

person Brondahl    schedule 14.03.2021

Я обнаружил, что самый простой способ выдать ошибку - выполнить поиск SQL по следующему запросу:

THROW 99999, 'Error message thrown', 1

Для нас мы широко используем приложения-функции Azure, поэтому мы создали специальную функцию под названием ThrowError, которая выдает ошибку с сообщением, предоставленным в качестве параметра. Это самый простой вариант, только если вы уже используете приложения-функции Azure, не стоит создавать только одну функцию.

person Michael Erickson    schedule 03.06.2021