1 /* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 /* 17 * 本部件处理错误的原则: 18 * 原则1:使用异常表示错误,但只有无法处理的问题才算得上是错误,否则只是普通的边界分支; 19 * 原则2:仅在模块内部使用异常,而在界面层Catch所有异常,从而防止异常扩散; 20 * 原则3:在注释里通过throw关键字注明可能抛出的异常,通报使用风险。 21 */ 22 #ifndef OHOS_FILEMGMT_BACKUP_B_ERROR_H 23 #define OHOS_FILEMGMT_BACKUP_B_ERROR_H 24 25 #include <errors.h> 26 #include <functional> 27 #include <map> 28 #include <string> 29 #include <string_view> 30 #include <system_error> 31 #include <vector> 32 33 #if __has_builtin(__builtin_FILE) && __has_builtin(__builtin_LINE) && __has_builtin(__builtin_FUNCTION) 34 #define DEFINE_SOURCE_LOCATION \ 35 int lineNo = __builtin_LINE(), const char *fileName = __builtin_FILE(), \ 36 const char *functionName = __builtin_FUNCTION() 37 #else 38 #define DEFINE_SOURCE_LOCATION int lineNo = -1, const char *fileName = "NA", const char *functionName = "NA" 39 #endif 40 41 namespace OHOS::FileManagement::Backup { 42 using ErrCode = int; 43 using ErrParam = std::function<std::tuple<uint32_t, std::string>()>; 44 45 class BError : public std::exception { 46 public: 47 /** 48 * @brief 错误码,新增错误码时需要同步补充默认错误信息 49 * 50 */ 51 enum class Codes : ErrCode { 52 // 0 无错误 53 OK = 0x0, 54 55 // 1~999 标准平台错误 56 57 // 0x1000~0x1999 backup_utils错误 58 UTILS_INVAL_JSON_ENTITY = 0x1000, 59 UTILS_INVAL_FILE_HANDLE = 0x1001, 60 UTILS_INVAL_TARBALL_ARG = 0x1002, 61 UTILS_INVAL_PROCESS_ARG = 0x1003, 62 UTILS_INTERRUPTED_PROCESS = 0x1004, 63 64 // 0x2000~0x2999 backup_tool错误 65 TOOL_INVAL_ARG = 0x2000, 66 67 // 0x3000~0x3999 backup_sa错误 68 SA_INVAL_ARG = 0x3000, 69 SA_BROKEN_IPC = 0x3001, 70 SA_REFUSED_ACT = 0x3002, 71 SA_BROKEN_ROOT_DIR = 0x3003, 72 SA_FORBID_BACKUP_RESTORE = 0x3004, 73 SA_BOOT_EXT_TIMEOUT = 0x3005, 74 SA_BUNDLE_INFO_EMPTY = 0x3006, 75 SA_BOOT_EXT_FAIL = 0x3007, 76 SA_SESSION_CONFLICT = 0x3008, 77 78 // 0x4000~0x4999 backup_SDK错误 79 SDK_INVAL_ARG = 0x4000, 80 SDK_BROKEN_IPC = 0x4001, 81 SDK_MIXED_SCENARIO = 0x4002, 82 83 // 0x5000~0x5999 backup_ext错误 84 EXT_INVAL_ARG = 0x5000, 85 EXT_BROKEN_FRAMEWORK = 0x5001, 86 EXT_BROKEN_BACKUP_SA = 0x5002, 87 EXT_BROKEN_IPC = 0x5003, 88 EXT_ABILITY_DIED = 0x5004, 89 EXT_ABILITY_TIMEOUT = 0x5005, 90 EXT_FORBID_BACKUP_RESTORE = 0x5006, 91 EXT_BACKUP_PACKET_ERROR = 0x5007, 92 EXT_METHOD_NOT_EXIST = 0x5008, 93 EXT_THROW_EXCEPTION = 0x5009, 94 EXT_BACKUP_UNPACKET_ERROR = 0x5010, 95 EXT_TIMER_ERROR = 0x5011, 96 EXT_CREATE_DIR_ERROR = 0x5012, 97 98 // 0x6000~0x6999 sa_ext错误 99 SA_EXT_ERR_CALL = 0x6000, 100 SA_EXT_ERR_SAMGR = 0x6001, 101 SA_EXT_RELOAD_FAIL = 0x6002, 102 }; 103 104 enum BackupErrorCode { 105 E_IPCSS = 13600001, 106 E_PERM = 13900001, 107 E_NOTEXIST = 13900002, 108 E_IO = 13900005, 109 E_NOMEM = 13900011, 110 E_INVAL = 13900020, 111 E_NOSPC = 13900025, 112 E_UKERR = 13900042, 113 E_FORBID = 13500001, 114 E_BTO = 13500002, 115 E_ETO = 13500003, 116 E_DIED = 13500004, 117 E_EMPTY = 13500005, 118 E_PACKET = 13500006, 119 E_EXCEPTION = 13500007, 120 E_UNPACKET = 13500008, 121 E_BEF = 13500009, 122 E_TASKFAIL = 13500010, 123 E_CANCEL_UNSTARTED_TASK = 13500011, 124 E_CANCEL_NO_TASK = 13500012, 125 E_CONFLICT = 13500013, 126 E_INCOMPATIBLE = 13500014, 127 E_FORCE_TIMEOUT = 13500015, 128 }; 129 130 public: 131 /** 132 * @brief 返回OHOS标准错误码 133 * 134 * @return int 标注错误码 135 */ 136 int GetCode() const; 137 138 /** 139 * @brief 根据系统的errno返回OHOS标准错误码 140 * 141 * @return int 标注错误码 142 */ 143 static int32_t GetCodeByErrno(int32_t errnoSys); 144 145 /** 146 * @brief 返回原始错误码 147 * 148 * @return Codes 原始错误码 149 */ GetRawCode()150 Codes GetRawCode() const 151 { 152 return code_; 153 } 154 155 /** 156 * @brief 返回错误信息 157 * 158 * @return const char* 错误信息 159 */ what()160 const char *what() const noexcept override 161 { 162 return msg_.c_str(); 163 } 164 165 /** 166 * @brief 归一返回备份恢复错误码 167 * 168 * @return ErrCode 备份恢复错误码 169 */ 170 static ErrCode GetBackupCodeByErrno(ErrCode err); 171 172 /** 173 * @brief 归一返回备份恢复错误信息 174 * 175 * @return string 备份恢复错误信息 176 */ 177 static std::string GetBackupMsgByErrno(ErrCode err); 178 public: 179 /** 180 * @brief 重载bool操作符,判断当前错误是否是错误 181 * 182 * @return true 是错误 183 * @return false 不是错误 184 */ 185 explicit operator bool() const 186 { 187 return code_ != Codes::OK; 188 } 189 190 /** 191 * @brief 返回OHOS标准错误码 192 * 193 * @return int 标准错误码 194 */ 195 operator int() const 196 { 197 return GetCode(); 198 } 199 200 public: 201 /** 202 * @brief 构造错误对象 203 * 204 * @param code 备份系统标准错误码,取自本类中的Codes 205 * @param lineNo 构造错误对象的行号(不要自己填写) 206 * @param fileName 构造错误对象的文件(不要自己填写) 207 * @param functionName 构造错误对象的函数(不要自己填写) 208 */ code_(code)209 explicit BError(Codes code = Codes::OK, DEFINE_SOURCE_LOCATION) : code_(code) 210 { 211 msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {mpErrToMsg_.at(code_)}); 212 } 213 214 /** 215 * @brief 构造错误对象 216 * 217 * @param code 备份系统标准错误码,取自本类中的Codes 218 * @param extraMsg 追加的详细错误信息 219 * @param lineNo 构造错误对象的行号(不要自己填写) 220 * @param fileName 构造错误对象的文件(不要自己填写) 221 * @param functionName 构造错误对象的函数(不要自己填写) 222 */ BError(Codes code,const std::string_view & extraMsg,DEFINE_SOURCE_LOCATION)223 BError(Codes code, const std::string_view &extraMsg, DEFINE_SOURCE_LOCATION) : code_(code) 224 { 225 msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {mpErrToMsg_.at(code_), extraMsg}); 226 } 227 228 /** 229 * @brief 构造错误对象 230 * 231 * @param stdErrno 失败的LIBC调用通过errno返回的错误码 232 * @param lineNo 构造错误对象的行号(不要自己填写) 233 * @param fileName 构造错误对象的文件(不要自己填写) 234 * @param functionName 构造错误对象的函数(不要自己填写) 235 */ BError(int stdErrno,DEFINE_SOURCE_LOCATION)236 explicit BError(int stdErrno, DEFINE_SOURCE_LOCATION) : code_ {stdErrno} 237 { 238 std::string rawMsg = std::generic_category().message(stdErrno); 239 msg_ = WrapMessageWithExtraInfos(fileName, lineNo, functionName, code_, {rawMsg}); 240 } 241 242 private: 243 static inline const std::map<Codes, std::string_view> mpErrToMsg_ = { 244 {Codes::OK, "No error"}, 245 {Codes::UTILS_INVAL_JSON_ENTITY, "Json utils operated on an invalid file"}, 246 {Codes::UTILS_INVAL_FILE_HANDLE, "File utils received an invalid file handle"}, 247 {Codes::UTILS_INVAL_TARBALL_ARG, "Tarball utils received an invalid argument"}, 248 {Codes::UTILS_INVAL_PROCESS_ARG, "Process utils received an invalid argument"}, 249 {Codes::UTILS_INTERRUPTED_PROCESS, "Can't launch a process or the process was corrupted"}, 250 {Codes::TOOL_INVAL_ARG, "TOOL received invalid arguments"}, 251 {Codes::SA_INVAL_ARG, "SA received invalid arguments"}, 252 {Codes::SA_BROKEN_IPC, "SA failed to issue a IPC"}, 253 {Codes::SA_REFUSED_ACT, "SA refuse to act"}, 254 {Codes::SA_BROKEN_ROOT_DIR, "SA failed to operate on the given root dir"}, 255 {Codes::SA_FORBID_BACKUP_RESTORE, "SA forbid backup or restore"}, 256 {Codes::SA_BOOT_EXT_TIMEOUT, "SA boot application extension time out"}, 257 {Codes::SA_BUNDLE_INFO_EMPTY, "SA the bundle info for backup/restore is empty"}, 258 {Codes::SA_BOOT_EXT_FAIL, "SA failed to boot application extension"}, 259 {Codes::SDK_INVAL_ARG, "SDK received invalid arguments"}, 260 {Codes::SDK_BROKEN_IPC, "SDK failed to do IPC"}, 261 {Codes::SDK_MIXED_SCENARIO, "SDK involed backup/restore when doing the contrary"}, 262 {Codes::EXT_INVAL_ARG, "Extension received an invalid argument"}, 263 {Codes::EXT_BROKEN_FRAMEWORK, "Extension found the appex framework is broken"}, 264 {Codes::EXT_BROKEN_BACKUP_SA, "Extension found the backup SA died"}, 265 {Codes::EXT_BROKEN_IPC, "Extension failed to do IPC"}, 266 {Codes::EXT_ABILITY_TIMEOUT, "Extension process timeout"}, 267 {Codes::EXT_ABILITY_DIED, "Extension process died"}, 268 {Codes::EXT_FORBID_BACKUP_RESTORE, "forbid backup or restore"}, 269 {Codes::EXT_BACKUP_PACKET_ERROR, "Backup packet error"}, 270 {Codes::EXT_METHOD_NOT_EXIST, "Extension method not exist"}, 271 {Codes::EXT_THROW_EXCEPTION, "Extension throw exception"}, 272 {Codes::EXT_BACKUP_UNPACKET_ERROR, "Backup unpacket error"}, 273 {Codes::SA_EXT_ERR_CALL, "SA Extension received invalid arguments"}, 274 {Codes::SA_EXT_ERR_SAMGR, "SA Extension get samgr failed"}, 275 {Codes::SA_EXT_RELOAD_FAIL, "SA Extension reload failed"}, 276 {Codes::SA_SESSION_CONFLICT, "Session Conflict"}, 277 }; 278 279 static inline const std::map<int, int> errCodeTable_ { 280 {static_cast<int>(Codes::OK), static_cast<int>(Codes::OK)}, 281 {static_cast<int>(Codes::UTILS_INVAL_JSON_ENTITY), BackupErrorCode::E_INVAL}, 282 {static_cast<int>(Codes::UTILS_INVAL_FILE_HANDLE), BackupErrorCode::E_INVAL}, 283 {static_cast<int>(Codes::UTILS_INVAL_TARBALL_ARG), BackupErrorCode::E_UKERR}, 284 {static_cast<int>(Codes::UTILS_INVAL_PROCESS_ARG), BackupErrorCode::E_UKERR}, 285 {static_cast<int>(Codes::UTILS_INTERRUPTED_PROCESS), BackupErrorCode::E_UKERR}, 286 {static_cast<int>(Codes::TOOL_INVAL_ARG), BackupErrorCode::E_UKERR}, 287 {static_cast<int>(Codes::SA_INVAL_ARG), BackupErrorCode::E_INVAL}, 288 {static_cast<int>(Codes::SA_BROKEN_IPC), BackupErrorCode::E_IPCSS}, 289 {static_cast<int>(Codes::SA_REFUSED_ACT), BackupErrorCode::E_PERM}, 290 {static_cast<int>(Codes::SA_BROKEN_ROOT_DIR), BackupErrorCode::E_UKERR}, 291 {static_cast<int>(Codes::SA_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID}, 292 {static_cast<int>(Codes::SA_BOOT_EXT_TIMEOUT), BackupErrorCode::E_BTO}, 293 {static_cast<int>(Codes::SA_BUNDLE_INFO_EMPTY), BackupErrorCode::E_EMPTY}, 294 {static_cast<int>(Codes::SA_BOOT_EXT_FAIL), BackupErrorCode::E_BEF}, 295 {static_cast<int>(Codes::SDK_INVAL_ARG), BackupErrorCode::E_INVAL}, 296 {static_cast<int>(Codes::SDK_BROKEN_IPC), BackupErrorCode::E_IPCSS}, 297 {static_cast<int>(Codes::SDK_MIXED_SCENARIO), BackupErrorCode::E_INVAL}, 298 {static_cast<int>(Codes::EXT_INVAL_ARG), BackupErrorCode::E_INVAL}, 299 {static_cast<int>(Codes::EXT_BROKEN_FRAMEWORK), BackupErrorCode::E_UKERR}, 300 {static_cast<int>(Codes::EXT_BROKEN_BACKUP_SA), BackupErrorCode::E_IPCSS}, 301 {static_cast<int>(Codes::EXT_BROKEN_IPC), BackupErrorCode::E_IPCSS}, 302 {static_cast<int>(Codes::EXT_ABILITY_DIED), BackupErrorCode::E_DIED}, 303 {static_cast<int>(Codes::EXT_ABILITY_TIMEOUT), BackupErrorCode::E_ETO}, 304 {static_cast<int>(Codes::EXT_FORBID_BACKUP_RESTORE), BackupErrorCode::E_FORBID}, 305 {static_cast<int>(Codes::EXT_BACKUP_PACKET_ERROR), BackupErrorCode::E_PACKET}, 306 {static_cast<int>(Codes::EXT_METHOD_NOT_EXIST), BackupErrorCode::E_INVAL}, 307 {static_cast<int>(Codes::EXT_THROW_EXCEPTION), BackupErrorCode::E_EXCEPTION}, 308 {static_cast<int>(Codes::EXT_BACKUP_UNPACKET_ERROR), BackupErrorCode::E_UNPACKET}, 309 {static_cast<int>(Codes::SA_EXT_ERR_CALL), BackupErrorCode::E_INVAL}, 310 {static_cast<int>(Codes::SA_EXT_ERR_SAMGR), BackupErrorCode::E_IPCSS}, 311 {static_cast<int>(Codes::SA_EXT_RELOAD_FAIL), BackupErrorCode::E_BEF}, 312 {static_cast<int>(Codes::SA_SESSION_CONFLICT), BackupErrorCode::E_CONFLICT}, 313 {BackupErrorCode::E_IPCSS, BackupErrorCode::E_IPCSS}, 314 {BackupErrorCode::E_INVAL, BackupErrorCode::E_INVAL}, 315 {BackupErrorCode::E_NOTEXIST, BackupErrorCode::E_NOTEXIST}, 316 {BackupErrorCode::E_UKERR, BackupErrorCode::E_UKERR}, 317 {BackupErrorCode::E_PERM, BackupErrorCode::E_PERM}, 318 {BackupErrorCode::E_NOMEM, BackupErrorCode::E_NOMEM}, 319 {BackupErrorCode::E_NOSPC, BackupErrorCode::E_NOSPC}, 320 {BackupErrorCode::E_IO, BackupErrorCode::E_IO}, 321 {BackupErrorCode::E_FORBID, BackupErrorCode::E_FORBID}, 322 {BackupErrorCode::E_BTO, BackupErrorCode::E_BTO}, 323 {BackupErrorCode::E_ETO, BackupErrorCode::E_ETO}, 324 {BackupErrorCode::E_DIED, BackupErrorCode::E_DIED}, 325 {BackupErrorCode::E_EMPTY, BackupErrorCode::E_EMPTY}, 326 {BackupErrorCode::E_PACKET, BackupErrorCode::E_PACKET}, 327 {BackupErrorCode::E_EXCEPTION, BackupErrorCode::E_EXCEPTION}, 328 {BackupErrorCode::E_UNPACKET, BackupErrorCode::E_UNPACKET}, 329 {BackupErrorCode::E_BEF, BackupErrorCode::E_BEF}, 330 {BackupErrorCode::E_CANCEL_UNSTARTED_TASK, BackupErrorCode::E_CANCEL_UNSTARTED_TASK}, 331 {BackupErrorCode::E_CANCEL_NO_TASK, BackupErrorCode::E_CANCEL_NO_TASK}, 332 {BackupErrorCode::E_CONFLICT, BackupErrorCode::E_CONFLICT}, 333 {BackupErrorCode::E_FORCE_TIMEOUT, BackupErrorCode::E_FORCE_TIMEOUT}, 334 {BackupErrorCode::E_INCOMPATIBLE, BackupErrorCode::E_INCOMPATIBLE}, 335 }; 336 337 static inline const std::map<int, int> sysErrnoCodeTable_ { 338 {EPERM, BackupErrorCode::E_PERM}, 339 {EIO, BackupErrorCode::E_IO}, 340 {EBADF, BackupErrorCode::E_IO}, 341 {EACCES, BackupErrorCode::E_IO}, 342 {EFBIG, BackupErrorCode::E_IO}, 343 {ENOMEM, BackupErrorCode::E_NOMEM}, 344 {EMFILE, BackupErrorCode::E_NOMEM}, 345 {ENOENT, BackupErrorCode::E_INVAL}, 346 {ENOTDIR, BackupErrorCode::E_INVAL}, 347 {EISDIR, BackupErrorCode::E_INVAL}, 348 {ENAMETOOLONG, BackupErrorCode::E_INVAL}, 349 {ENOSPC, BackupErrorCode::E_NOSPC}, 350 }; 351 352 static inline const std::map<int, std::string> backupErrorMsgTable_ { 353 {BackupErrorCode::E_IPCSS, "IPC error"}, 354 {BackupErrorCode::E_INVAL, "Invalid argument"}, 355 {BackupErrorCode::E_NOTEXIST, "Method not exist"}, 356 {BackupErrorCode::E_UKERR, "Unknown error"}, 357 {BackupErrorCode::E_PERM, "Operation not permitted"}, 358 {BackupErrorCode::E_NOMEM, "Out of memory"}, 359 {BackupErrorCode::E_NOSPC, "No space left on device"}, 360 {BackupErrorCode::E_IO, "I/O error"}, 361 {BackupErrorCode::E_FORBID, "Not support backup/restore"}, 362 {BackupErrorCode::E_BTO, "SA boot extension timeout"}, 363 {BackupErrorCode::E_ETO, "Extension process timeout"}, 364 {BackupErrorCode::E_DIED, "Extension process died"}, 365 {BackupErrorCode::E_EMPTY, "SA the bundle info for backup/restore is empty"}, 366 {BackupErrorCode::E_PACKET, "Tar failed"}, 367 {BackupErrorCode::E_EXCEPTION, "Extension throw exception"}, 368 {BackupErrorCode::E_UNPACKET, "Untar failed"}, 369 {BackupErrorCode::E_BEF, "SA failed to boot application extension"}, 370 {BackupErrorCode::E_CANCEL_UNSTARTED_TASK, "Cancel unstarted backup or restore task "}, 371 {BackupErrorCode::E_CANCEL_NO_TASK, "Cancel a backup or restore task that does not exist"}, 372 {BackupErrorCode::E_CONFLICT, "Session Conflict"}, 373 {BackupErrorCode::E_INCOMPATIBLE, "Not compatible"}, 374 {BackupErrorCode::E_FORCE_TIMEOUT, "Exit actively"} 375 }; 376 377 private: 378 Codes code_ {Codes::OK}; 379 std::string msg_; 380 381 private: 382 /** 383 * @brief 生成如下格式的打印信息 → [文件名:行号->函数名] 默认错误信息. 补充错误信息 384 * 385 * @param fileName 构造错误对象的文件 386 * @param lineNo 构造错误对象的行号 387 * @param functionName 构造错误对象的函数 388 * @param msgs 所有待追加的错误信息 389 * @return std::string 打印信息 390 */ 391 std::string WrapMessageWithExtraInfos(const char *fileName, 392 int lineNo, 393 const char *functionName, 394 Codes code, 395 const std::vector<std::string_view> &msgs) const; 396 }; 397 } // namespace OHOS::FileManagement::Backup 398 399 #endif // OHOS_FILEMGMT_BACKUP_B_ERROR_H