In Roblox, there are three different types of error handlers. pcall, xpcall, and ypcall. Each of them run the provided function (for these three it'll always be the first) in a separate thread and suppresses errors. Both pcall and ypcall return the same values. The first value it returns is whether the function succeeded or not. When this value is false, there was an error. When it is true, the function ran successfully. The second value, if the function errored, is the error message. If the function succeeded, the other values will be the values returned by the function call. For a short while in Roblox, you were unable to yield in pcall (aka protected call). ypcall was then added (aka yieldable protected call), allowing you to yield in protected calls. However, to remain consistent with Lua, they added the ability to yield in pcall by (literally) setting ypcall to pcall (for a while when pcall errored it'd tell you the error was coming from ypcall in the stack trace). xpcall, on the contrary, is a bit different. The difference is that the second argument to xpcall is the error handler. The error handler is supplied one parameter, which is the error message. The error handler is only called if the main function errors. xpcall returns almost the same values as pcall. The first is whether the main function ran successfully. If the function ran successfully, then the other values are the values returned by the main function. Otherwise, the other values are the values returned by the error handler.
I hope this helped. You might not be able to completely understand all of this but you can use it as a reference as you start getting more advanced. Also, correct me if you spot an error.