Error.Record สร้างระเบียนข้อผิดพลาดที่มีข้อมูลโครงสร้าง ด้วย reason, message, detail และ errorCode เพื่อให้การจัดการข้อผิดพลาดละเอียดขึ้น
= Error.Record(reason as text, optional message as nullable text, optional detail as any, optional parameters as nullable list, optional errorCode as nullable text) as record
= Error.Record(reason as text, optional message as nullable text, optional detail as any, optional parameters as nullable list, optional errorCode as nullable text) as record
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| reason | text | Yes | ข้อความที่อธิบายเหตุผลหลักของข้อผิดพลาด (เช่น ‘DivideByZero’, ‘ValidationFailed’, ‘CustomerNotFound’) | |
| message | nullable text | Optional | null | ข้อความรายละเอียดเพิ่มเติมที่อธิบายข้อผิดพลาด ช่วยให้ผู้ใช้เข้าใจสาเหตุ |
| detail | any | Optional | null | ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด สามารถเป็นข้อความ ตัวเลข หรือโครงสร้างอื่น |
| parameters | nullable list | Optional | null | รายการค่าที่ให้บริบทเพิ่มเติมสำหรับการวินิจฉัยหรือการจัดการแบบโปรแกรมเชิง |
| errorCode | nullable text | Optional | null | รหัสข้อผิดพลาดที่ระบุตัวตนสำหรับการอ้างอิง (เช่น ‘ERR404’, ‘ERR500’) |
let Input = 100, Divisor = 0, Result = try if Divisor = 0 then error Error.Record( "DivideByZero", "ไม่สามารถหารด้วยศูนย์ได้" ) else Input / Divisor catch (e) =…let
Input = 100,
Divisor = 0,
Result = try
if Divisor = 0 then
error Error.Record(
"DivideByZero",
"ไม่สามารถหารด้วยศูนย์ได้"
)
else
Input / Divisor
catch (e) => e
in
Result
[HasError = true, Error = [Reason = "DivideByZero", Message = "ไม่สามารถหารด้วยศูนย์ได้"]]
let CustomerId = 12345, Result = try if CustomerId > 9999 then error Error.Record( "CustomerNotFound", Text.Format("รหัสลูกค้า #{0} ไม่พบในระบบ", {CustomerId}),…let
CustomerId = 12345,
Result = try
if CustomerId > 9999 then
error Error.Record(
"CustomerNotFound",
Text.Format("รหัสลูกค้า #{0} ไม่พบในระบบ", {CustomerId}),
"ลูกค้าไม่มีอยู่ในฐานข้อมูล",
{Text.Format("Invalid ID = #{0}", {CustomerId})},
"ERR404"
)
else
CustomerId
catch (e) => e
in
Result
[HasError = true, Error = [Reason = "CustomerNotFound", Message = "รหัสลูกค้า #12345 ไม่พบในระบบ", Detail = "ลูกค้าไม่มีอยู่ในฐานข้อมูล", ErrorCode = "ERR404"]]
let Value = "ABC", Result = try if Value is text and not Number.FromText(Value) then error Error.Record( "InvalidType", "ค่า '" & Value & "' ไม่สามารถแปลงเป็นตั…let
Value = "ABC",
Result = try
if Value is text and not Number.FromText(Value) then
error Error.Record(
"InvalidType",
"ค่า '" & Value & "' ไม่สามารถแปลงเป็นตัวเลขได้",
"โปรดตรวจสอบรูปแบบของข้อมูล",
{Value, "Number"},
"ERR_INVALID_TYPE"
)
else
Number.FromText(Value)
catch (e) => e
in
Result
[HasError = true, Error = [Reason = "InvalidType", Message = "ค่า 'ABC' ไม่สามารถแปลงเป็นตัวเลขได้", Detail = "โปรดตรวจสอบรูปแบบของข้อมูล", ErrorCode = "ERR_INVALID_TYPE"]]
let Source = Table.FromRows({{1, "John", 25}, {2, "Jane", -5}, {3, "Bob", 35}}, {"ID", "Name", "Age"}), ValidateAge = Table.AddColumn( Source, "AgeValidation",…let
Source = Table.FromRows({{1, "John", 25}, {2, "Jane", -5}, {3, "Bob", 35}}, {"ID", "Name", "Age"}),
ValidateAge = Table.AddColumn(
Source,
"AgeValidation",
each
try
if [Age] < 0 or [Age] > 120 then
error Error.Record(
"AgeOutOfRange",
Text.Format("ชื่อ #{0} มีอายุ #{1} ซึ่งอยู่นอกช่วงที่ยอมรับได้", {[Name], [Age]}),
"อายุต้องอยู่ระหว่าง 0 ถึง 120 ปี",
{[Age], "0-120"},
"ERR_AGE_INVALID"
)
else
"Valid"
catch (e) => e
)
in
ValidateAge
ตารางที่แสดงผลการตรวจสอบแต่ละแถว โดยแถวที่ 2 (Jane อายุ -5) จะมี error object ที่มี Reason="AgeOutOfRange" และแถวอื่นแสดง "Valid"
ผมจะอธิบาย error ใช้สำหรับการแจ้งข้อผิดพลาดแบบง่ายๆ เช่น error “Something went wrong” ส่วน Error.Record ใช้สำหรับสร้างระเบียนข้อผิดพลาดที่มีข้อมูลโครงสร้าง ประกอบด้วย reason, message, detail, parameters และ errorCode ทำให้สามารถจัดการข้อผิดพลาดได้ละเอียดและมีประสิทธิภาพกว่า
ผมแนะนำให้ใช้ error Error.Record(…) ภายใน try block แล้ว catch ไว้ เพราะอย่างนี้คุณสามารถเข้าถึงข้อมูลข้อผิดพลาดทั้งหมดที่ Error.Record สร้างให้ได้ ส่วน try-otherwise ใช้สำหรับเงื่อนไขแล้ว จึงไม่เหมาะสำหรับ Error.Record
ผม reason เป็นพารามิเตอร์บังคับเท่านั้น ส่วนอื่นๆ ทั้งหมดเป็นตัวเลือก แต่ส่วนตัวผม ถ้าต้องสร้างข้อผิดพลาด ผมอยากให้เติม message กับ errorCode ด้วย เพราะมันช่วยให้ผู้ใช้เข้าใจปัญหาได้และสามารถค้นหาจัดหมวดหมู่ข้อผิดพลาดได้ในภายหลัง
Error.Record สร้างข้อมูลข้อผิดพลาด (error record) ที่มีโครงสร้างชัดเจน ด้วยการระบุ reason, message, detail และ errorCode ทำให้การจัดการข้อผิดพลาดเป็นไปอย่างมีระเบียบ แทนที่จะปล่อยให้ Power Query สร้างข้อความข้อผิดพลาดแบบสุ่มๆ
ที่เจ๋งคือ Error.Record ช่วยให้คุณสร้างข้อผิดพลาดที่กำหนดเองกับข้อมูลบริบท เช่น รหัสลูกค้าที่ไม่ถูกต้อง หรือข้อมูลที่ไม่ตรงกับรูปแบบ ทำให้ผู้ใช้เข้าใจปัญหาได้ชัดเจนมากกว่าข้อความผิดพลาดปกติ
ส่วนตัวผม Error.Record ถูกใช้ประจำเวลาต้องตรวจสอบเงื่อนไขข้อมูลขาเข้า เพราะมันช่วยให้ debugging ง่ายขึ้นจริงๆ แล้วลูกค้าเข้าใจปัญหาได้มากกว่าข้อความผิดพลาดปกติของ Power Query 😎