Chia sẻ qua


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 ý

Nếu ứng dụng đã tắt tính năng Quản lý lỗi cấp công thức trong Cài đặt>Cập nhật>Đã ngừng hoạt động, các chức năng đó sẽ không hoạt động chính xác.

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 là 0, vì 1/x sẽ tạo ra 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

IfError trả về giá trị của một trong các đối số của nó. 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ụ cuối cùng, Patch trả về một bản ghi không tương thích với các giá trị Boolean được sử dụng cho công thức Thay thế 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ị ép phải khớp với loại của đối số thứ nhất.

Excel hiển thị #DIV/0! khi có phép chia cho số không.

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!" bị ép buộc theo kiểu của đối số đầu tiên tới IfError, là một số. Kết quả của IfError là một lỗi khác vì chuỗi văn bản không thể bị ép buộc. Để 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 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 luôn trả về cùng một giá trị như First( AllErrors ).

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

Trường Loại Description
Loại Enum ErrorKind (số) Danh mục của lỗi.
Tin nhắn 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, giá trị này có 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, giá trị này có dạng ControlName.PropertyName.
Chi tiết Bản ghi Chi tiết về lỗi. Hiện tại, thông tin chi tiết chỉ được cung cấp cho 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 nội dung của phản hồi từ trình 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, chỉ có một lỗi mà FirstError có thể xử lý đượ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 IsError sẽ ngăn chặn mọi quá trình xử lý lỗi tiếp theo.

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 xử lý lỗi, giá trị trống được sử dụng để biểu diễn 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.

Sử dụng IsBlankOrError sẽ ngăn chặn mọi quá trình xử lý lỗi tiếp theo.

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

Lỗi( ErrorRecord )
Lỗi( Bảng lỗi )

  • 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. Loại 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, Thay thế1 [, Value2 , Thay thế2, ... [, DefaultResult ] )

  • Giá trị – Bắt buộc. Công thức để kiểm tra giá trị lỗi.
  • Thay thế – 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 – Tùy chọn. 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( Giá trị )
IsBlankOrError( Giá trị )

  • Giá trị – 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ả
Nếu lỗi( 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
Nếu Lỗi( 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
NếuLỗi( 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
NếuLỗi( 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( "Đã xảy ra sự cố nội bộ" ) ) Đố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ả
Lỗi ( 1 ) Đối số không phải là lỗi. SAI
IsError( Trống() ) Đối số là một giá trị trống, nhưng không phải là lỗi. SAI
Lỗi ( 1/0 ) Đối số lỗi. ĐÚNG VẬY
Nếu( IsError( 1/0 ), Thông báo( "Có sự cố nội bộ" ) ) Đố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). ĐÚNG VẬY

IsBlankOrError đơn giản

Công thức Mô tả Kết quả
Lỗi Trống Hoặc Lỗi ( 1 ) Đối số không phải là lỗi hay giá trị trống. SAI
IsBlankOrError( Trống() ) Đối số là một giá trị trống. ĐÚNG VẬY
IsBlankOrError( 1/0 ) Đối số lỗi. ĐÚNG VẬY

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 ở trạng thái lỗi vì hàm Giá trị có đối số không hợp lệ. Bởi vì người viết công thức không mong đợi điều này nên nó được truyền qua để người dùng có thể nhìn thấy. Trong trường hợp thứ hai, với cùng công thức, b có giá trị 0, dẫn đến phép chia cho không. 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 số 0 không phải là vấn đề trong một bối 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.

    Nhãn 1 hiển thị giá trị 1234 vì đây là đầu vào hợp lệ cho hàm Giá trị.

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

    Nhãn 1 hiển thị giá trị -1 vì đây không phải là đầu vào hợp lệ cho hàm Giá trị. 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

Công thức tham khảo cho Power Apps