Reference:
https://blog.csdn.net/joson1234567890/article/details/117376263
Error handling:
https://blog.csdn.net/a15835774652/article/details/82151502
https://blog.csdn.net/alwaysbefine/article/details/107216380
https://blog.csdn.net/q258523454/article /details/84555847