Các hàm Error, IfError, IsError, IsBlankOrError

Áp dụng cho: Ứng dụng canvas Dataverse cột công thức Luồng máy tính để bàn Ứng dụng dựa trên mô hình Power Pages Power Platform CLI

Phát hiện lỗi và cung cấp giá trị thay thế hoặc thực hiện biện pháp xử lý. Tạo một lỗi tùy chỉnh hoặc truyền qua một lỗi.

Lưu ý

IfError

Hàm IfError kiểm tra các giá trị cho đến khi tìm thấy lỗi. Nếu phát hiện lỗi, hàm sẽ đánh giá và trả về giá trị thay thế tương ứng và dừng đánh giá thêm. Hàm cũng có thể cung cấp một giá trị mặc định khi không tìm thấy lỗi. Cấu trúc của hàm IfError giống như của hàm If: hàm IfError kiểm tra xem có lỗi không, trong khi hàm If kiểm tra xem có phải là true không.

Sử dụng hàm IfError để thay thế lỗi bằng một giá trị hợp lệ để có thể tiếp tục các phép tính tiếp theo. Ví dụ: sử dụng hàm này nếu nội dung mà người dùng nhập có thể dẫn đến phép chia cho 0:

IfError( 1/x, 0 )

Công thức này trả về 0 nếu giá trị của x bằng 0, vì 1/x sẽ dẫn đến lỗi. Nếu x không phải là 0, hàm sẽ trả về 1/x.

Dừng xử lý thêm

Khi kết hợp các công thức với nhau thành chuỗi trong công thức hành vi, chẳng hạn như:

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

Hàm Patch với DS2 sẽ được thực hiện ngay cả khi hàm Patch đầu tiên với DS1 không thực hiện được. Phạm vi lỗi được giới hạn trong mỗi công thức trong chuỗi.

Dùng hàm IfError để thực hiện một hành động và chỉ tiếp tục xử lý nếu hành động đó thành công. Áp dụng hàm IfError cho ví dụ sau đây:

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

Nếu hàm Patch với DS1 gặp vấn đề, thì Notify đầu tiên sẽ được thực thi. Hàm sẽ dừng hoạt động xử lý, kể cả việc thực hiện hàm Patch thứ hai với DS2. Nếu hàm Patch đầu tiên thành công, hàm Patch thứ hai sẽ thực thi.

Hàm sẽ trả về đối số DefaultResult tùy chọn (nếu có) nếu không thấy lỗi. Nếu không có đối số này, hàm sẽ trả về đối số Value gần đây nhất.

Dựa trên ví dụ gần đây nhất, giá trị trả về từ hàm IfError có thể được kiểm tra để xác định xem có vấn đề gì không:

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

Khả năng tương thích của loại

Hàm IfError sẽ trả về giá trị của một trong các đối số. Loại của tất cả các giá trị mà hàm IfError có thể trả về phải tương thích.

Trong ví dụ gần đây nhất, hàm Patch sẽ trả về một bản ghi không tương thích với giá trị Boolean dùng cho công thức Replacement hoặc DefaultResult. Không vấn đề gì bởi vì không có trường hợp nào giá trị trả về từ những lệnh gọi Patch sẽ được hàm IfError trả về.

Lưu ý

Mặc dù hành vi trong quá trình thay đổi nhưng loại của tất cả các đối số trong hàm IfError hiện phải tương thích.

Trong ví dụ đơn giản được mô tả trước đó:

IfError( 1/x, 0 )

Các loại 1/x0 tương thích vì cả hai đều là số. Nếu không, đối số thứ hai sẽ bị buộc phải khớp với loại của đối số thứ nhất.

Excel sẽ hiển thị #DIV/0! khi xảy ra phép chia cho 0.

Cân nhắc dùng công thức sau đây cho hàm IfError:

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

Công thức trên sẽ không hoạt động. Chuỗi văn bản "#DIV/0!" sẽ bị buộc phải cùng loại với đối số đầu tiên (dạng số) trong hàm IfError. Hàm IfError sẽ trả về lỗi khác vì không thể buộc một chuỗi văn bản. Để khắc phục, hãy chuyển đổi đối số đầu tiên thành chuỗi văn bản để hàm IfError luôn trả về một chuỗi văn bản:

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

Như trình bày ở trên, hàm IfError có thể trả về lỗi nếu Replacement hoặc DefaultResult lỗi.

FirstError / AllErrors

Trong các công thức thay thế, thông tin về các lỗi tìm thấy có sẵn qua bản ghi FirstError và bảng AllErrors. AllErrors là bảng gồm các bản ghi thông tin lỗi với FirstError là lối tắt đến bản ghi đầu tiên của bảng này. FirstError sẽ luôn trả về giá trị giống như First( AllErrors ).

Các bản ghi lỗi bao gồm:

Trường Loại Description
Kiểu Enum ErrorKind (số) Danh mục của lỗi.
Thư Chuỗi văn bản Thông báo về lỗi, thích hợp để được hiển thị cho người dùng cuối.
Nguồn Chuỗi văn bản Vị trí nơi xảy ra lỗi, được sử dụng để báo cáo. Ví dụ: đối với công thức được liên kết với thuộc tính điều khiển, thuộc tính này sẽ ở dạng ControlName.PropertyName.
Đã quan sát Chuỗi văn bản Vị trí trong đó lỗi hiển thị cho người dùng, được dùng để báo cáo. Ví dụ: đối với công thức được liên kết với thuộc tính điều khiển, thuộc tính này sẽ ở dạng ControlName.PropertyName.
Details Bản ghi Chi tiết về lỗi. Hiện tại, chi tiết chỉ được cung cấp cho các lỗi mạng. Bản ghi này bao gồm HttpStatusCode chứa mã trạng thái HTTP và HttpResponse chứa phần thân của phản hồi từ kết nối hoặc dịch vụ.

Ví dụ: cân nhắc sử dụng công thức sau làm thuộc tính OnSelect của công cụ điều khiển Nút.

Set( a, 1/0 )

Và công thức này trên thuộc tính OnSelect của điều khiển Nút thứ hai:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

Công thức ví dụ ở trên sẽ hiển thị biểu ngữ sau khi hai nút được kích hoạt theo trình tự:

Công cụ điều khiển nút được kích hoạt, hiển thị thông báo từ hàm Thông báo.

Thông thường, sẽ chỉ có một lỗi mà FirstError có thể khắc phục được. Tuy nhiên, có những trường hợp có thể trả về nhiều lỗi. Ví dụ: khi sử dụng toán tử tạo chuỗi công thức hoặc hàm Concurrent. Ngay cả trong những tình huống này, việc báo cáo FirstError có thể đủ để phát hiện sự cố thay vì khiến người dùng bị quá tải với nhiều lỗi. Nếu bạn vẫn có yêu cầu xử lý từng lỗi riêng lẻ, bạn có thể sử dụng bảng AllErrors.

IsError

Hàm IsError kiểm tra giá trị lỗi.

Hàm trả về giá trị Boolean true hoặc false.

Sử dụng hàm IsError để dừng hoạt động xử lý lỗi.

IsBlankOrError

Hàm IsBlankOrError kiểm tra để đảm bảo giá trị trống hoặc giá trị lỗi tương đương với Or( IsBlank( X ), IsError( X ) ).

Khi bật xử lý lỗi cho các ứng dụng hiện có, hãy cân nhắc việc thay thế IsBlank bằng IsBlankOrError để duy trì hành vi ứng dụng hiện có. Trước khi bổ sung tính năng xử lý lỗi, một giá trị trống đã được sử dụng để đại diện cho cả giá trị null từ cơ sở dữ liệu và giá trị lỗi. Tính năng xử lý lỗi sẽ phân tách hai cách diễn giải này về giá trị trống có thể thay đổi hành vi của các ứng dụng hiện có đang tiếp tục sử dụng IsBlank.

Hàm trả về giá trị boolean true hoặc false.

Việc sử dụng IsBlankOrError sẽ ngăn mọi thao tác xử lý lỗi khác.

Hãy sử dụng hàm Error để tạo và báo cáo lỗi tùy chỉnh. Ví dụ: bạn có thể có logic để xác định xem bất kỳ giá trị đã cho nào có hợp lệ cho ngữ cảnh của bạn hay không—một điều gì đó không được kiểm tra tự động để tìm sự cố. Bạn có thể tạo và trả về lỗi của riêng mình, hoàn thành với LoạiThông báo, sử dụng cùng một bản ghi được mô tả ở trên cho hàm IfError.

Trong trường hợp IfError, hãy sử dụng hàm Error để tính lại hoặc chuyển qua lỗi. Ví dụ: logic của bạn trong IfError có thể quyết định rằng trong một số trường hợp, lỗi có thể được bỏ qua một cách an toàn, nhưng trong các trường hợp khác, lỗi rất quan trọng để gửi qua. Trong IfError hoặc App.OnError, hãy sử dụng Error( FirstError ) để vượt qua một lỗi.

Hàm Lỗi cũng có thể được chuyển qua một bảng lỗi, như sẽ thấy trong bảng AllErrors. Sử dụng Error( AllErrors ) để tính lại tất cả các lỗi chứ không chỉ lỗi đầu tiên.

Một bản ghi trống hoặc bảng trống được chuyển đến Error không dẫn đến lỗi.

Cú pháp

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – Bắt buộc. Bản ghi thông tin lỗi, bao gồm Loại, Thông báo và các trường khác. Kind là bắt buộc. FirstError có thể được truyền trực tiếp.
  • ErrorTable – Bắt buộc. Bảng của bản ghi thông tin lỗi. AllErrors có thể được truyền trực tiếp.

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

  • Value(s) – Bắt buộc. Công thức để kiểm tra giá trị lỗi.
  • Replacement(s) – Bắt buộc. Các công thức để đánh giá và giá trị trả về nếu việc so khớp các đối số Value trả về lỗi.
  • DefaultResult – Không bắt buộc. Các công thức để đánh giá nếu công thức không tìm thấy bất kỳ lỗi nào.

IsError( Value )
IsBlankOrError( Value )

  • Value – Bắt buộc. Công thức để kiểm tra.

Ví dụ

Hàm IfError đơn giản

Công thức Mô tả Kết quả
IfError( 1, 2 ) Đối số đầu tiên không phải là lỗi. Hàm không có lỗi nào khác để kiểm tra và không có giá trị trả về mặc định. Hàm trả về đối số value mới nhất đã đánh giá. 1
IfError( 1/0, 2 ) Đối số đầu tiên trả về giá trị lỗi (do phép chia cho 0). Hàm đánh giá đối số thứ hai và trả về kết quả là đối số này. 2
IfError( 10, 20, 30 ) Đối số đầu tiên không phải là lỗi. Hàm không có lỗi nào khác để kiểm tra nhưng có giá trị trả về mặc định. Hàm trả về đối số DefaultResult (Kết quả mặc định). 30
IfError( 10, 11, 20, 21, 300 ) Đối số đầu tiên 10 không lỗi, vì vậy hàm không đánh giá giá trị thay thế tương ứng của đối số đó (11). Đối số thứ 3 20 không lỗi, vì vậy hàm không đánh giá giá trị thay thế tương ứng của đối số đó (21). Đối số thứ 5 300 không có giá trị thay thế tương ứng và là kết quả mặc định. Hàm trả về kết quả đó vì công thức không chứa lỗi. 300
IfError( 1/0, Notify( "There was an internal problem" ) ) Đối số đầu tiên trả về giá trị lỗi (do phép chia cho 0). Hàm đánh giá đối số thứ 2 và hiển thị thông báo cho người dùng. Giá trị trả về của hàm IfError là giá trị trả về của hàm Notify, bị buộc phải cùng loại với đối số đầu tiên trong hàm IfError (dạng số). 1

Hàm IsError đơn giản

Công thức Mô tả Kết quả
IsError( 1 ) Đối số không phải là lỗi. sai
IsError( Blank() ) Đối số là một giá trị trống, nhưng không phải là lỗi. sai
IsError( 1/0 ) Đối số lỗi. true
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) Đối số của hàm IsError trả về giá trị lỗi (do phép chia cho 0). Hàm này trả về giá trị true, điều này khiến If hiển thị thông báo cho người dùng bằng hàm Notify. Giá trị trả về của hàm If là giá trị trả về của hàm Notify, bị buộc phải cùng loại với đối số đầu tiên trong hàm If (dạng boolean). true

IsBlankOrError đơn giản

Công thức Mô tả Kết quả
IsBlankOrError( 1 ) Đối số không phải là lỗi hay giá trị trống. sai
IsBlankOrError( Blank() ) Đối số là một giá trị trống. true
IsBlankOrError( 1/0 ) Đối số lỗi. true

Simple Error

Trong ví dụ này, các ngày được xác thực tương đối với nhau, dẫn đến lỗi nếu có sự cố.

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

Trong ví dụ này, một số lỗi được phép bỏ qua trong khi những lỗi khác bị loại bỏ và thay thế bằng một giá trị. Trong trường hợp đầu tiên, b sẽ ở trạng thái lỗi vì hàm Value có đối số không hợp lệ. Vì đây là điều người viết công thức không lường trước được nên nó được truyền qua nên người dùng sẽ nhìn thấy. Trong trường hợp thứ hai, với cùng một công thức, b sẽ có giá trị 0, dẫn đến chia hết cho 0. Trong trường hợp này, người viết công thức có thể biết rằng điều này có thể chấp nhận được đối với logic này, loại bỏ lỗi (không có biểu ngữ nào được hiển thị) và thay vào đó trả về -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

Bảng AllErrors có thể được lọc giống như bất kỳ bảng nào khác. Được sử dụng với hàm Error, các lỗi dự kiến có thể được loại bỏ và các lỗi còn lại được giữ lại và báo cáo. Ví dụ: nếu chúng ta biết rằng phép chia cho 0 sẽ không thành vấn đề trong một ngữ cảnh cụ thể, thì những lỗi đó có thể được lọc ra, giữ nguyên tất cả các lỗi khác bằng công thức sau:

Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )

Hướng dẫn chi tiết

  1. Thêm công cụ điều khiển Nội dung nhập văn bản rồi đặt tên là TextInput1 nếu mặc định không có tên đó.

  2. Thêm công cụ điều khiển Nhãn rồi đặt tên là Label1 nếu mặc định không có tên đó.

  3. Đặt công thức cho thuộc tính Văn bản của Label1 như sau:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. Trong TextInput1, hãy nhập 1234.

    Label1 sẽ hiển thị giá trị 1234 vì đây là giá trị hợp lệ cho hàm Value.

  5. Trong TextInput1, hãy nhập ToInfinity.

    Label1 sẽ hiển thị giá trị -1 vì đây không là giá trị hợp lệ cho hàm Value. Nếu không dùng hàm Value trong hàm IfError, nhãn sẽ không hiển thị giá trị nào vì giá trị lỗi được coi là blank.

Xem thêm

Tham chiếu công thức cho Power Apps