다음을 통해 공유


Error, IfError, IsError, IsBlankOrError 함수

적용 대상: 캔버스 앱 Dataverse 수식 열 데스크톱 흐름 모델 기반 앱 Power Pages Power Platform CLI

오류를 감지하고 대체 값을 제공하거나 작업을 수행합니다. 사용자 지정 오류를 생성하거나 오류를 전달합니다.

노트

  • 이 문서에서 설명하는 동작은 설정 > 예정 기능 > 프리뷰수식 수준 오류 관리 프리뷰 기능이 켜져 있을 때만 사용할 수 있습니다.

IfError

IfError 함수는 오류를 찾을 때까지 값을 테스트합니다. 함수가 오류를 발견하면 해당 대체 값을 평가하여 반환하고 추가 평가를 중지합니다. 오류가 발견되지 않은 경우 기본값을 제공할 수도 있습니다. IfError의 구조는 If 함수와 비슷하지만 IfError는 오류를 테스트하는 반면 Iftrue를 테스트합니다.

IfError를 사용해 오류를 유효한 값으로 교체하여 다운스트림 계산이 지속될 수 있도록 합니다. 예를 들어, 사용자 입력으로 인해 0으로 나눌 수있 는 경우 이 함수를 사용합니다.

IfError( 1/x, 0 )

이 수식은 x의 값이 0이면 1/x가 오류를 생성함에 따라 0을 반환합니다. 만약 x가 0이 아니라면 1/x가 반환됩니다.

추가 처리 중지

연결 수식이 동작 수식에서 다음과 같을 때:

Patch( DS1, ... );
Patch( DS2, ... )

DS2의 두 번째 Patch 함수는 DS1Patch가 실패해도 시도될 것입니다. 오류의 범위는 연결된 각 수식으로 제한됩니다.

IfError를 사용해 작업을 수행할 땐 작업이 성공적인 경우에만 계속 진행하십시오. 이 예제에서 IfError를 적용하면 다음과 같습니다.

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" ),
    Patch( DS2, ... ), Notify( "problem in the second action" )
)

DS1Patch에서 문제가 있는 경우 첫 번째 Notify가 실행됩니다. DS2Patch를 포함하는 추가적인 진행이 이루어지지 않습니다. 첫 번째 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에 의해 반환될 수 있는 모든 값의 형식은 호환되야 합니다.

마지막 예에서 PatchReplacement 수식 또는 DefaultResult에 사용되는 불리언과 호환되지 않는 레코드를 반환합니다. Patch 호출의 반환 값에 아무런 상황이 없기 때문에 괜찮으며 IfError에 의해 반환됩니다.

노트

변경을 위한 동작이 진행되는 동안 IfError에 대한 모든 인수의 형식은 현재 호환됩니다.

앞에서 설명한 간단한 예:

IfError( 1/x, 0 )

1/x0의 유형은 둘 다 숫자이기 때문에 호환되었습니다. 그렇지 않은 경우 두 번째 인수는 첫 번째 인수의 형식과 일치하도록 강제됩니다.

0으로 나누기가 발생하면 Excel에 #DIV/0!이 표시됩니다.

IfError에 대해 다음을 고려하십시오.

IfError( 1/x, "#DIV/0!" )

위의 수식은 작동하지 않습니다. 텍스트 문자열 "#DIV/0!"IfError에 대한 첫 번째 인수 형식으로 강제되며 이는 숫자입니다. 텍스트 문자열이 위임되지 않았기 때문에 IfError의 결과는 또 다른 오류를 생성합니다. 이를 고치려면 첫 번째 인수를 텍스트 문자열로 변환하여 IfError가 항상 텍스트 문자열을 반환하게 합니다.

IfError( Text( 1/x ), "#DIV/0!" )

위에서 나오듯 IfErrorReplacement 또는 DefaultResult가 오류인 경우 오류를 반환합니다.

FirstError / AllErrors

대체 수식 내에서 발견된 오류에 대한 정보는 FirstError 레코드 및 AllErrors 테이블을 통해 사용할 수 있습니다. AllErrorsFirstError가 이 테이블의 첫 번째 레코드에 대한 바로 가기인 오류 정보 레코드 테이블입니다. FirstError는 항상 First( AllErrors )와 동일한 값을 반환합니다.

오류 기록에는 다음이 포함됩니다.

필드 Type 설명
종류 ErrorKind 열거 (숫자) 오류 범주입니다.
메시지 텍스트 문자열 최종 사용자에게 표시하기에 적합한 오류에 대한 메시지입니다.
출처 텍스트 문자열 보고에 사용되는 오류가 발생한 위치입니다. 예를 들어 컨트롤 속성에 바인딩된 수식은 ControlName.PropertyName 형식이 됩니다.
Observed 텍스트 문자열 보고에 사용되는 오류가 사용자에게 표시되는 위치입니다. 예를 들어 컨트롤 속성에 바인딩된 수식은 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 ) )

위의 예제 수식은 두 개의 단추가 차례로 활성화될 때 다음 배너를 표시합니다.

Notify 함수로부터 알림을 보여주는 Button 컨트롤 활성화.

일반적으로 FirstError가 충분히 작업할 수 있는 오류는 하나뿐입니다. 그러나 여러 오류가 반환될 수 있는 시나리오가 있습니다. 예를 들어 수식 연결 연산자Concurrent 함수를 사용할 때입니다. 이러한 상황에서도 FirstError를 보고하면 여러 오류로 사용자에게 과부하를 주는 대신 문제를 드러내기에 충분할 수 있습니다. 여전히 각 오류를 개별적으로 처리해야 하는 요구 사항이 있는 경우 AllErrors 테이블을 사용할 수 있습니다.

IsError

IsError 함수는 오류 값을 테스트합니다.

반환 값은 부울 true 또는 false입니다.

IsError 사용은 추가적인 오류 처리를 방지합니다.

IsBlankOrError

IsBlankOrError 함수는 빈 값 또는 오류 값인지, Or( IsBlank( X ), IsError( X ) )와 동일한지를 테스트합니다.

기존 앱에 대해 오류 처리를 사용하도록 설정할 경우 기존 앱 동작을 보존하기 위해 IsBlankIsBlankOrError로 교체하는 것을 고려해보세요. 오류 처리를 하기 전 공백 값은 데이터베이스의 null 값과 오류 값을 모두 나타내기 위해 사용되었습니다. 오류 처리는 IsBlank를 계속 사용하는 기존 앱의 동작을 변경할 수 있는 공백에 대한 두 가지 해석을 구분합니다.

반환 값은 부울 true 또는 false입니다.

IsBlankOrError를 사용하면 오류의 추가 처리를 방지합니다.

Error 함수를 사용하여 사용자 지정 오류를 만들고 보고합니다. 예를 들어 주어진 값이 컨텍스트에 유효한지 여부(자동으로 문제를 확인하지 않은 것)를 결정하는 논리가 있을 수 있습니다. IfError 함수에 대해 위에서 설명한 것과 동일한 레코드를 사용하여 KindMessage로 완성된 고유한 오류를 생성하고 반환할 수 있습니다.

IfError 컨텍스트에서 Error 함수를 사용하여 오류를 다시 발생시키거나 전달합니다. 예를 들어 IfError의 논리는 어떤 경우에는 오류를 안전하게 무시할 수 있지만 다른 경우에는 오류를 전달하는 것이 중요하다고 결정할 수 있습니다. IfError 또는 App.OnError 내에서 Error( FirstError )를 사용하여 오류를 전달합니다.

Error 함수는 AllErrors 테이블에서 볼 수 있는 것처럼 오류 테이블을 전달할 수도 있습니다. 첫 번째 오류뿐만 아니라 모든 오류를 다시 발생시키려면 Error( AllErrors )를 사용합니다.

Error에 전달된 레코드 또는 빈 테이블은 오류가 발생하지 않습니다.

구문

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – 필수. Kind, Message 및 기타 필드를 포함한 오류 정보 레코드입니다. Kind는 필수입니다. FirstError는 직접 전달할 수 있습니다.
  • ErrorTable – 필수 항목입니다. 오류 정보 레코드 테이블. AllErrors는 직접 전달할 수 있습니다.

IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )

  • Value(s) – 필수 항목입니다. 오류 값을 테스트할 수식입니다.
  • Replacement – 필수 항목입니다. 일치하는 Value 인수가 오류를 반환한 경우 평가할 수식과 반환할 값입니다.
  • DefaultResult – 선택 사항입니다. 수식에 오류가 없는지 평가할 수식입니다.

IsError( Value )
IsBlankOrError( Value )

  • Value - 필수 항목입니다. 테스트할 공식입니다.

예제

간단한 IfError

수식 설명 결과
IfError( 1, 2 ) 첫 번째 인수는 오류가 아닙니다. 이 함수에는 확인할 다른 오류가 없으며 기본 반환 값이 없습니다. 이 함수는 마지막으로 평가된 value 인수를 반환합니다. 1
IfError( 1/0, 2 ) 첫 번째 인수는(0으로 나누기로 인해) 오류 값을 반환합니다. 이 함수는 두 번째 인수를 평가하여 결과로 반환합니다. 2
IfError( 10, 20, 30 ) 첫 번째 인수는 오류가 아닙니다. 이 함수에는 확인할 다른 오류가 없으며 기본 반환 값이 없습니다. 이 함수는 DefaultResult 인수를 반환합니다. 30
IfError( 10, 11, 20, 21, 300 ) 첫 번째 인수 10은 오류가 아니므로 함수는 해당 인수의 해당 대체 11을 평가하지 않습니다. 세 번째 인수 20도 오류가 아니므로 함수는 해당 인수의 해당 대체 21을 평가하지 않습니다. 다섯 번째 인수 300은 해당 대체가 없으며 기본 결과입니다. 수식에 오류가 없으므로 함수는 해당 결과를 반환합니다. 300
IfError( 1/0, Notify( "내부 문제가 발생했습니다" ) ) 첫 번째 인수는(0으로 나누기로 인해) 오류 값을 반환합니다. 함수는 두 번째 인수를 평가하고 사용자에게 메시지를 표시합니다. IfError의 반환 값은 Notify의 반환 값이며 IfError(숫자)의 첫 번째 인수와 동일한 형식으로 강제 변환됩니다. 1

간단한 IsError

수식 설명 결과
IsError( 1 ) 이 인수는 오류가 아닙니다. 거짓
IsError( Blank() ) 인수가 공백이지만 오류는 아닙니다. 거짓
IsError( 1/0 ) 이 인수는 오류입니다. true
If( IsError( 1/0 ), Notify( "내부 문제가 발생했습니다" ) ) IsError에 대한 이 인수는 오류 값을 반환합니다(0으로 나누기로 인해). 이 함수는 으로 반환되어 IfNotify 함수로 사용자에게 메시지를 표시하도록 합니다. If의 반환 값은 Notify의 반환 값이며 If(부울)의 첫 번째 인수와 동일한 형식으로 강제 변환됩니다. true

Simple IsBlankOrError

수식 설명 결과
IsBlankOrError( 1 ) 인수가 오류가 아니거나 공백이 아닙니다. 거짓
IsBlankOrError( Blank() ) 인수가 공백입니다. true
IsBlankOrError( 1/0 ) 이 인수는 오류입니다. true

단순 오류

이 예에서 날짜는 서로 상대적으로 유효성이 검사되므로 문제가 있는 경우 오류가 발생합니다.

If( StartDate > EndDate,
    Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )

이 예에서 일부 오류는 통과할 수 있지만 다른 오류는 억제되고 값으로 대체됩니다. 첫 번째 경우에는 Value 함수에 잘못된 인수가 있기 때문에 b는 오류 상태가 됩니다. 이는 수식 작성기에서 예상치 못한 것이기 때문에 사용자가 볼 수 있도록 전달됩니다. 두 번째 경우에는 동일한 공식을 사용하여 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 ) )

단계별

  1. Text input 컨트롤을 추가하고 기본 이름이 없는 경우 이름을 TextInput1로 지정합니다.

  2. Label 컨트롤을 추가하고 기본 이름이 없는 경우 이름을 Label1로 지정합니다.

  3. Label1Text 속성에 대한 수식을 다음과 같이 설정합니다.

    IfError( Value( TextInput1.Text ), -1 )
    
  4. TextInput1에서 1234를 입력합니다.

    Label1에 1234 값이 표시됩니다. 이것이 Value 함수에 대한 유효한 입력이기 때문입니다.

  5. TextInput1에서 ToInfinity를 입력합니다.

    Label1에 1 값이 표시됩니다. 이것이 Value 함수에 대한 유효한 입력이 아니기 때문입니다. IfError를 사용하여 Value 함수를 래핑하지 않으면 오류 값이 공백으로 처리되므로 레이블에 값이 표시되지 않습니다.

참조

Power Apps용 수식 참조