Error, IfError, IsError, IsBlankOrError 함수
적용 대상: 캔버스 앱 Dataverse 수식 열 바탕 화면 흐름 모델 기반 앱 Power Pages Power Platform CLI
오류를 감지하고 대체 값을 제공하거나 작업을 수행합니다. 사용자 지정 오류를 생성하거나 오류를 전달합니다.
참고
앱에서 설정, 업데이트, 종료 아래의 수식 수준 오류 관리 기능을 비활성화한 경우, 해당 기능은 제대로 작동하지 않습니다.>>
IfError
IfError 함수는 오류를 찾을 때까지 값을 테스트합니다. 함수가 오류를 발견하면 해당 대체 값을 평가하여 반환하고 추가 평가를 중지합니다. 오류가 발견되지 않은 경우 기본값을 제공할 수도 있습니다. IfError의 구조는 If 함수와 비슷하지만 IfError는 오류를 테스트하는 반면 If는 true를 테스트합니다.
IfError를 사용해 오류를 유효한 값으로 교체하여 다운스트림 계산이 지속될 수 있도록 합니다. 예를 들어, 사용자 입력으로 인해 0으로 나눌 수있 는 경우 이 함수를 사용합니다.
IfError( 1/x, 0 )
이 수식은 값이 0인 경우 0
오류를 발생시키므로 x
값을 반환합니다. 1/x
만약 x
가 0이 아니라면 1/x
가 반환됩니다.
추가 처리 중지
Patch( DS1, ... );
Patch( DS2, ... )
DS2
의 두 번째 Patch 함수는 DS1
의 Patch가 실패해도 시도될 것입니다. 오류의 범위는 연결된 각 수식으로 제한됩니다.
IfError를 사용해 작업을 수행할 땐 작업이 성공적인 경우에만 계속 진행하십시오. 이 예제에서 IfError를 적용하면 다음과 같습니다.
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
DS1
의 Patch에서 문제가 있는 경우 첫 번째 Notify가 실행됩니다. DS2
의 Patch를 포함하는 추가적인 진행이 이루어지지 않습니다. 첫 번째 Patch가 성공하면, 두 번째 Patch도 실행됩니다.
제공된 경우 옵션 DefaultResult 인수는 오류가 발견되지 않으면 반환됩니다. 이 인수가 없으면 마지막 값 인수가 반환됩니다.
마지막 예를 바탕으로 IfError의 반환 값에 문제가 있는지 확인할 수 있습니다.
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
형식 호환성
IfError 는 인수 중 하나의 값을 반환합니다. IfError에 의해 반환될 수 있는 모든 값의 형식은 호환되야 합니다.
마지막 예에서 Patch 는 Replacement 수식이나 DefaultResult에 사용된 부울과 호환되지 않는 레코드를 반환합니다. Patch 호출의 반환 값에 아무런 상황이 없기 때문에 괜찮으며 IfError에 의해 반환됩니다.
노트
변경을 위한 동작이 진행되는 동안 IfError에 대한 모든 인수의 형식은 현재 호환됩니다.
앞에서 설명한 간단한 예:
IfError( 1/x, 0 )
1/x
및 0
의 유형은 둘 다 숫자이기 때문에 호환되었습니다. 그렇지 않은 경우, 두 번째 인수는 첫 번째 인수의 유형과 일치하도록 강제 변환됩니다.
Excel에서는 0으로 나누면 #DIV/0! 가 표시됩니다.
IfError에 대해 다음을 고려하십시오.
IfError( 1/x, "#DIV/0!" )
위의 수식은 작동하지 않습니다. 텍스트 문자열은 "#DIV/0!"
IfError 의 첫 번째 인수의 유형으로 강제 변환됩니다. 첫 번째 인수의 유형은 숫자입니다. IfError 의 결과는 텍스트 문자열을 강제 변환할 수 없기 때문에 또 다른 오류입니다. 이를 고치려면 첫 번째 인수를 텍스트 문자열로 변환하여 IfError가 항상 텍스트 문자열을 반환하게 합니다.
IfError( Text( 1/x ), "#DIV/0!" )
위에서 나오듯 IfError는 Replacement 또는 DefaultResult가 오류인 경우 오류를 반환합니다.
FirstError / AllErrors
대체 수식 내에서 발견된 오류에 대한 정보는 FirstError 레코드 및 AllErrors 테이블을 통해 사용할 수 있습니다. AllErrors 는 오류 정보 레코드 테이블이고, FirstError 는 이 테이블의 첫 번째 레코드에 대한 바로가기입니다. FirstError 는 항상 First( AllErrors ) 와 동일한 값을 반환합니다.
오류 기록에는 다음이 포함됩니다.
필드 | Type | 설명 |
---|---|---|
친절한 | ErrorKind 열거 (숫자) | 오류 범주입니다. |
메시지 | 텍스트 문자열 | 최종 사용자에게 표시하기에 적합한 오류에 대한 메시지입니다. |
원천 | 텍스트 문자열 | 보고에 사용되는 오류가 발생한 위치입니다. 예를 들어, 컨트롤 속성에 바인딩된 수식의 경우 이 값은 ControlName.PropertyName 형식입니다. |
관찰됨 | 텍스트 문자열 | 보고에 사용되는 오류가 사용자에게 표시되는 위치입니다. 예를 들어, 컨트롤 속성에 바인딩된 수식의 경우 이 값은 ControlName.PropertyName 형식입니다. |
세부 정보 | 녹음 | 오류에 대한 세부 정보입니다. 현재는 네트워크 오류에 대한 세부정보만 제공됩니다. 이 레코드에는 HTTP 상태 코드가 포함된 HttpStatusCode와 커넥터 또는 서비스의 응답 본문이 포함된 HttpResponse가 포함됩니다. |
예를 들어, Button 컨트롤의 OnSelect 속성을 다음 수식으로 설정하는 것을 고려해봅니다.
Set( a, 1/0 )
그리고 두 번째 Button 컨트롤의 OnSelect 속성에 대한 이 수식은 다음과 같습니다.
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
위의 예제 수식은 두 개의 단추가 차례로 활성화될 때 다음 배너를 표시합니다.
일반적으로 FirstError 가 충분히 작동할 수 있는 오류는 단 하나뿐입니다. 그러나 여러 오류가 반환될 수 있는 시나리오가 있습니다. 예를 들어 수식 연결 연산자나 Concurrent 함수를 사용할 때입니다. 이러한 상황에서도 FirstError를 보고하면 여러 오류로 사용자에게 과부하를 주는 대신 문제를 드러내기에 충분할 수 있습니다. 여전히 각 오류를 개별적으로 처리해야 하는 요구 사항이 있는 경우 AllErrors 테이블을 사용할 수 있습니다.
IsError
IsError 함수는 오류 값을 테스트합니다.
반환 값은 부울 true 또는 false입니다.
IsError 를 사용하면 더 이상 오류를 처리할 수 없습니다.
IsBlankOrError
IsBlankOrError 함수는 빈 값 또는 오류 값인지, Or( IsBlank( X ), IsError( X ) )
와 동일한지를 테스트합니다.
기존 앱에 대해 오류 처리를 사용하도록 설정할 경우 기존 앱 동작을 보존하기 위해 IsBlank을 IsBlankOrError로 교체하는 것을 고려해보세요. 오류 처리 기능이 추가되기 전에는 데이터베이스의 null 값과 오류 값을 모두 나타내기 위해 빈 값 이 사용되었습니다. 오류 처리는 IsBlank를 계속 사용하는 기존 앱의 동작을 변경할 수 있는 공백에 대한 두 가지 해석을 구분합니다.
반환 값은 부울 true 또는 false입니다.
IsBlankOrError 를 사용하면 더 이상 오류를 처리할 수 없습니다.
Error 함수를 사용하여 사용자 지정 오류를 만들고 보고합니다. 예를 들어 주어진 값이 컨텍스트에 유효한지 여부(자동으로 문제를 확인하지 않은 것)를 결정하는 논리가 있을 수 있습니다. IfError 함수에 대해 위에서 설명한 것과 동일한 레코드를 사용하여 Kind 및 Message로 완성된 고유한 오류를 생성하고 반환할 수 있습니다.
IfError 컨텍스트에서 Error 함수를 사용하여 오류를 다시 발생시키거나 전달합니다. 예를 들어 IfError의 논리는 어떤 경우에는 오류를 안전하게 무시할 수 있지만 다른 경우에는 오류를 전달하는 것이 중요하다고 결정할 수 있습니다. IfError 또는 App.OnError 내에서 Error( FirstError )를 사용하여 오류를 전달합니다.
Error 함수는 AllErrors 테이블에서 볼 수 있는 것처럼 오류 테이블을 전달할 수도 있습니다. 첫 번째 오류뿐만 아니라 모든 오류를 다시 발생시키려면 Error( AllErrors )를 사용합니다.
Error에 전달된 빈 레코드 또는 빈 테이블은 오류가 발생하지 않습니다.
구문
오류( ErrorRecord )
오류( 오류표 )
- ErrorRecord – 필수. Kind, Message 및 기타 필드를 포함한 오류 정보 레코드입니다. 종류 가 필요합니다. FirstError 는 직접 전달될 수 있습니다.
- ErrorTable – 필수. 오류 정보 레코드 테이블. AllErrors 는 직접 전달될 수 있습니다.
IfError( 값1, 교체1 [, 값2 , 교체2, ... [, 기본 결과 ] ] )
- 값 – 필수. 오류 값을 테스트할 수식입니다.
- 교체 - 필요함. 일치하는 Value 인수가 오류를 반환한 경우 평가할 수식과 반환할 값입니다.
- DefaultResult – 선택 사항. 수식에 오류가 없는지 평가할 수식입니다.
오류( 값 )
IsBlankOrError( 값 )
- 값 – 필수. 테스트할 공식입니다.
예제
간단한 IfError
수식 | 설명 | 결과 |
---|---|---|
오류가 발생하면( 1, 2 ) | 첫 번째 인수는 오류가 아닙니다. 이 함수에는 확인할 다른 오류가 없으며 기본 반환 값이 없습니다. 이 함수는 마지막으로 평가된 value 인수를 반환합니다. | 1 |
오류가 발생하면(1/0, 2) | 첫 번째 인수는(0으로 나누기로 인해) 오류 값을 반환합니다. 이 함수는 두 번째 인수를 평가하여 결과로 반환합니다. | 2 |
오류가 발생하면(10, 20, 30) | 첫 번째 인수는 오류가 아닙니다. 이 함수에는 확인할 다른 오류가 없으며 기본 반환 값이 없습니다. 이 함수는 DefaultResult 인수를 반환합니다. | 30 |
오류가 발생하면(10, 11, 20, 21, 300) | 첫 번째 인수 10은 오류가 아니므로 함수는 해당 인수의 해당 대체 11을 평가하지 않습니다. 세 번째 인수 20도 오류가 아니므로 함수는 해당 인수의 해당 대체 21을 평가하지 않습니다. 다섯 번째 인수 300은 해당 대체가 없으며 기본 결과입니다. 수식에 오류가 없으므로 함수는 해당 결과를 반환합니다. | 300 |
IfError( 1/0, Notify( "내부 문제가 발생했습니다." ) ) | 첫 번째 인수는(0으로 나누기로 인해) 오류 값을 반환합니다. 함수는 두 번째 인수를 평가하고 사용자에게 메시지를 표시합니다. IfError의 반환 값은 Notify의 반환 값이며 IfError(숫자)의 첫 번째 인수와 동일한 형식으로 강제 변환됩니다. | 1 |
간단한 IsError
수식 | 설명 | 결과 |
---|---|---|
오류입니다( 1 ) | 이 인수는 오류가 아닙니다. | 거짓 |
IsError(Blank()) | 인수가 공백이지만 오류는 아닙니다. | 거짓 |
오류입니다( 1/0 ) | 이 인수는 오류입니다. | 진실 |
If(IsError(1/0), Notify("내부 문제가 발생했습니다") | IsError에 대한 이 인수는 오류 값을 반환합니다(0으로 나누기로 인해). 이 함수는 참으로 반환되어 If가 Notify 함수로 사용자에게 메시지를 표시하도록 합니다. If의 반환 값은 Notify의 반환 값이며 If(부울)의 첫 번째 인수와 동일한 형식으로 강제 변환됩니다. | 진실 |
Simple IsBlankOrError
수식 | 설명 | 결과 |
---|---|---|
빈칸오류( 1 ) | 인수가 오류가 아니거나 공백이 아닙니다. | 거짓 |
IsBlankOrError(Blank()) | 인수가 공백입니다. | 진실 |
IsBlankOrError(1/0) | 이 인수는 오류입니다. | 진실 |
단순 오류
이 예에서 날짜는 서로 상대적으로 유효성이 검사되므로 문제가 있는 경우 오류가 발생합니다.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
이 예에서 일부 오류는 통과할 수 있지만 다른 오류는 억제되고 값으로 대체됩니다. 첫 번째 경우, b 는 Value 함수에 잘못된 인수가 있기 때문에 오류 상태에 있습니다. 이는 수식 작성자가 예상치 못한 일이므로 사용자가 볼 수 있도록 전달합니다. 두 번째 경우, 동일한 공식을 사용하면 b 의 값은 0이 되므로 0으로 나누는 결과가 됩니다. 이 경우 수식 작성자는 이것이 이 논리에 허용됨을 알고 오류를 억제하고(배너가 표시되지 않음) -1을 대신 반환할 수 있습니다.
With( {a: 1, b: Value("a")},
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument
With( {a: 1, b: 0} )
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1
AllErrors 테이블은 다른 테이블처럼 필터링할 수 있습니다. Error 함수와 함께 사용하면 예상 오류를 제거하고 나머지 오류를 유지하고 보고할 수 있습니다. 예를 들어, 특정 상황에서 0으로 나누는 것이 문제가 되지 않는다는 것을 알고 있다면 다음 공식을 사용하면 해당 오류를 필터링하여 다른 모든 오류를 그대로 유지할 수 있습니다.
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
단계별
Text input 컨트롤을 추가하고 기본 이름이 없는 경우 이름을 TextInput1로 지정합니다.
Label 컨트롤을 추가하고 기본 이름이 없는 경우 이름을 Label1로 지정합니다.
Label1의 Text 속성에 대한 수식을 다음과 같이 설정합니다.
IfError( Value( TextInput1.Text ), -1 )
TextInput1에서 1234를 입력합니다.
Label1은 값 1234 를 표시합니다. 이는 Value 함수에 대한 유효한 입력이기 때문입니다.
TextInput1에서 ToInfinity를 입력합니다.
Label1은 값 -1 을 표시합니다. 이는 Value 함수에 유효한 입력이 아니기 때문입니다. IfError를 사용하여 Value 함수를 래핑하지 않으면 오류 값이 공백으로 처리되므로 레이블에 값이 표시되지 않습니다.