SharePoint Online: Xử lý lỗi với Try Catch trong PowerShell
Một trong những cách thực hành tốt nhất khi viết tập lệnh PowerShell là xử lý các lỗi tiềm ẩn để đảm bảo tập lệnh thực thi suôn sẻ khi có sự cố. Ai có thể đảm bảo tập lệnh có thể chạy chính xác trong các môi trường khác nhau mọi lúc? Việc xử lý lỗi trong PowerShell được thực hiện dễ dàng với các khối try-catch tương tự như .NET framework. Khi có sự cố xảy ra với tập lệnh bên trong khối “Thử”, luồng tập lệnh sẽ được chuyển sang khối “Catch” để xử lý lỗi.
Thử Catch trong PowerShell SharePoint Online
Dưới đây là ví dụ cơ bản về cách xử lý lỗi Try-Catch hoạt động trong PowerShell dành cho SharePoint Online:
Try {
Connect-SPOService -url "https://crescent-admin.sharepoint.com"
}
Catch {
write-host -f Red "Error:" $_.Exception.Message
}
Trong ví dụ này, nếu một ngoại lệ được đưa ra trong khi thực thi mã trong khối try, tập lệnh sẽ chuyển sang khối catch, nơi thông báo lỗi sẽ được hiển thị bằng cách sử dụng khối Lệnh ghép ngắn Write-Host. Tương tự, đây là cách bạn có thể sử dụng Try-Catch trong tập lệnh CSOM để kiểm tra xem danh sách có tồn tại hay không:
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
#Function to check if a list or document library exists
Function Check-SPOListExists([Microsoft.SharePoint.Client.ClientContext]$Ctx, [String]$ListName)
{
Try {
$List = $Ctx.Web.Lists.GetByTitle($ListName)
$Ctx.Load($List)
$Ctx.ExecuteQuery()
Return $True
}
Catch [Exception] {
Write-host $_.Exception.Message -f Red
Return $False
}
}
#Config Parameters
$SiteUrl = "https://crescent.sharepoint.com/sites/projects"
$ListName="Project Documents"
#Get Credentials to connect
$Cred= Get-Credential
#Set up the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Call the function to Check List Exists
Check-SPOListExists -Ctx $Ctx -ListName $ListName
Bạn có thể làm bất cứ điều gì bạn muốn với thông báo lỗi, chẳng hạn như hiển thị cảnh báo tùy chỉnh trên màn hình thay vì hiển thị lỗi! Tuy nhiên, không phải tất cả các trường hợp ngoại lệ đều có thể được xử lý bằng khối Try-Catch! Hãy chạy đoạn script sau:
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$SubSiteURL = "2010"
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
Try {
#Get a subsite
$Web = Get-PnPWeb -Identity $SubSiteURL
}
Catch {
Write-host "Error:"$_.Exception.Message -f Red
}
Nếu bạn chạy tập lệnh này, bạn sẽ nhận được:
Mặc dù chúng tôi đã sử dụng khối Try-Catch trong tập lệnh nhưng bạn có thể thấy khối bắt không xử lý được lỗi! Điều này là do: Có hai loại lỗi trong PowerShell.
- Lỗi chấm dứt
- Lỗi không kết thúc.
Lỗi kết thúc là lỗi sẽ làm dừng một chức năng hoặc hoạt động. Các lỗi không kết thúc cho phép PowerShell tiếp tục và thường xuất phát từ các lệnh ghép ngắn hoặc các tình huống được quản lý khác. Theo mặc định, khối Try-Catch sẽ chỉ có thể bắt các lỗi kết thúc! Để có thể bắt lỗi Không kết thúc, bạn nên đặt biến $ErrorActionPreference hoặc đặt tham số ErrorAction của lệnh ghép ngắn.
Thử với nhiều khối bắt
try {
//Some Script
}
catch [Exception 1],[Exception 2] {
//Action something
}
catch {
//Generic error
Write-host $_.Exception.Message
}
Sử dụng tham số "ErrorAction":
Mọi lệnh ghép ngắn PowerShell đều hỗ trợ khóa chuyển ErrorAction. Bằng cách chỉ định “-ErrorAction Stop” ở cuối lệnh ghép ngắn, bạn đảm bảo mọi lỗi mà nó ném ra đều được coi là chấm dứt và có thể bị khối bắt bắt.
Try {
#Get a subsite
$Web = Get-PnPWeb -Identity $SubSiteURL -ErrorAction Stop
}
Catch {
Write-host "Subsite doesn't Exist!" -f Red
}
Đây là một ví dụ khác:
#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/Retail"
$FileURL = "/sites/Retail/Shared Documents/2019/SiteAdmins-UNKNOWN.csv"
Try {
#Connect to SharePoint admin site
Connect-PnPOnline -Url $SiteURL -Interactive
#Get the File
$File = Get-PnPFile -Url $FileURL -AsFileObject -ErrorAction Stop
Write-host $File.Length
}
Catch {
write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}
Sử dụng biến $ErrorActionPreference
Cũng có thể coi tất cả các lỗi là kết thúc bằng cách sử dụng biến ErrorActionPreference. Làm thế nào để bạn bắt được một lỗi không chấm dứt? Về cơ bản, bạn yêu cầu PowerShell coi đó là sự kết thúc. Bạn có thể biến tất cả các lỗi của mình thành việc chấm dứt bằng cách cài đặt - $ErrorActionPreference=“Stop”, và sau đó đặt lại thành “Tiếp tục”. Đây là một ví dụ:
#Config Variables
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$SubSiteURL = "2010"
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
Try {
#Set Error Preference variable to Stop
$ErrorActionPreference = "Stop"
#Get a subsite
$Web = Get-PnPWeb -Identity $SubSiteURL
}
Catch {
Write-host "Subsite doesn't Exist!" -f Red
}
Finally {
#Rest Error Preference to Default
$ErrorActionPreference = "Continue"
}
Khối “Cuối cùng” luôn chạy bất kể có lỗi hay không. Bằng cách này, chúng ta có thể thực hiện các hành động phải được thực hiện bất kể thao tác đó thành công hay thất bại.
Biến $ErrorActionPreference chỉ định hành động cần thực hiện để đối phó với lỗi xảy ra. Các giá trị sau được hỗ trợ:
- SilentlyContinue - Không hiển thị thông báo lỗi, tiếp tục thực thi tập lệnh tiếp theo. Nó ngăn chặn lỗi xuất ra trong shell.
- Tiếp tục - (Mặc định) Hiển thị thông báo lỗi và cố gắng tiếp tục thực hiện các lệnh tiếp theo.
- Yêu cầu - Nhắc người dùng về việc nên tiếp tục hay chấm dứt hành động
- Dừng - Chấm dứt hành động khi có lỗi.
- Ngắt - Nhập trình gỡ lỗi khi xảy ra lỗi hoặc có ngoại lệ.
- Bỏ qua: Loại bỏ thông báo lỗi và tiếp tục thực thi lệnh. Giá trị Bỏ qua được thiết kế để sử dụng cho mỗi lệnh, không được sử dụng làm tùy chọn đã lưu. Bỏ qua không phải là giá trị hợp lệ cho biến $ErrorActionPreference.


