比特币源码研读(7)-main函数(6)
识别完帮助信息和版本信息以后,下面是对异常时间的处理
try{
//保护代码
}
catch (const std::exception& e) {
PrintExceptionContinue(&e, "AppInit()");
}
catch (...) {
PrintExceptionContinue(nullptr, "AppInit()");
}
即如果try中的代码出现异常,则会被catch捕获。在这里我们先分析try中的“保护代码”
1)判断目录是否正确:如果目录不正确,则弹出对话框,提示数据目录不存在,并退出软件
if(!fs::is_directory(GetDataDir(false)))
{
fprintf(stderr, "Error: Specified data directory "%s"does not exist.\n", gArgs.GetArg("-datadir", "").c_str());
returnfalse;
}
if语句中fs定义是
namespace fs = boost::filesystem;
filesystem库是一种可移植的文件系统操作库,可以跨平台的操作目录、文件等,filesystem库的所有内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。这里介绍几个代码中用到的函数。
boost::filesystem::path path("");//初始化
boost::filesystem::is_directory(file_path)//判断file_path是否为目录。
/**********GetDataDir()函数分析****************************/
GetDataDir函数流程图
总体来说:
如果有path路径,则直接返回这个路径;
如果没有,则查看参数gArgs中是否设置了路径,如果设置且正确(如果设置的是网络目录,则转换成本地路径),则在本地创建这个路径,并返回路径;如果设置但错误,则清空path,返回空目录;
其中的函数说明:
函数1,L558
pathCached ,pathCachedNetSpecific定义在util.cpp中,如下
void ClearDatadirCache()
{
LOCK(csPathCached);
pathCached =fs::path();
pathCachedNetSpecific = fs::path();
}
函数2, L566
path =fs::system_complete(gArgs.GetArg("-datadir", ""));
转化路径为完整路径,详见
https://msdn.microsoft.com/en-us/library/hh874650(v=vs.120).aspx
函数3,L572
GetDefaultDataDir()
定义在util.cpp.返回默认路径,那默认路径是什么呢?
// Windows
// Windows >= Vista:C:\Users\Username\AppData\Roaming\Bitcoin
// Mac:~/Library/Application Support/Bitcoin
// Unix:~/.bitcoin
函数4,L 575
BaseParams().DataDir();
其中BaseParams函数定义在chainparamsbase.cpp文件,函数定义如下
const CBaseChainParams& BaseParams()
{
assert(globalChainBaseParams);
return*globalChainBaseParams;
}
返回的是*globalChainBaseParams,定义也在这个文件里,
static std::unique_ptrglobalChainBaseParams;
由定义可以看出,BaseParams是类CBaseChainParams,我们看看类CBaseChainParams
class CBaseChainParams
{
public:
/** BIP70 chainname strings (main, test or regtest) */
static conststd::string MAIN;
static conststd::string TESTNET;
static conststd::string REGTEST;
conststd::string& DataDir() const { return strDataDir; }
int RPCPort()const { return nRPCPort; }
protected:
CBaseChainParams() {}
int nRPCPort;
std::stringstrDataDir;
};
其中,可以看到DataDir()函数定义:
const std::string& DataDir() const { returnstrDataDir; }
定义在chainparamsbase.cpp中:
const std::string& DataDir() const { returnstrDataDir; }
//类注释中,我们可以看到BIP70,说明这个改进协议BIP70中应用到的。
/**********GetDataDir()函数分析结束****************************/
区块链研习社比特币源码研读班 electroman
以下是广告:
我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。
Excellent post. @electroman