版权声明:本文为博主原创文章,如需转载,请注明出处 。 https://blog.csdn.net/wx1528159409/article/details/85266856
HBase创建命名空间时,原本用的以下代码
public abstract class BaseDao{
//创建命名空间,如果命名空间不存在,则创建新的,否则不做任何操作
protected void createNamespaceNX(String nameSpace) throws IOException {
//创建默认配置对象
Configuration conf = HBaseConfiguration.create();
//获取连接对象
Connection connection = ConnectionFactory.createConnection(conf);
//获取管理对象
Admin admin = connection.getAdmin();
//获取命名空间
NamespaceDescriptor namespaceDescriptor = admin.getNamespaceDescriptor(nameSpace);
if(namespaceDescriptor == null){
//创建命名空间的描述器
namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
//管理对象创建命名空间
admin.createNamespace(namespaceDescriptor);
}
}
按照预想的逻辑,当namespaceDescriptor == null时,直接创建命名空间;
但是实际跑程序时,若命名空间不存在,会直接抛异常。
于是看了一下,getNamespaceDescriptor()方法的源码,如下
NamespaceDescriptor getNamespaceDescriptor(final String name)
throws NamespaceNotFoundException, IOException;
发现创建命名空间时,若命名空间不存在,需要用这个特定NamespaceNotFoundException进行抛异常;于是改进代码
小结:
对特殊异常需要处理时,用try catch的方式,单独捕捉异常并处理,
否则一律通过throw exception这种形式进行直接抛出,抛到框架最外层,由框架统一处理。
创建命名空间的正确代码如下:
public abstract class BaseDao{
//创建命名空间,如果命名空间不存在,则创建新的,否则不做任何操作
protected void createNamespaceNX(String nameSpace) throws IOException {
//创建默认配置对象
Configuration conf = HBaseConfiguration.create();
//获取连接对象
Connection connection = ConnectionFactory.createConnection(conf);
//获取管理对象
Admin admin = connection.getAdmin();
//以下是正确代码:
try{
admin.getNamespaceDescriptor(nameSpace);
}catch(NamespaceNotFoundException e){
//若发生特定的异常,即找不到命名空间,则创建命名空间
NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nameSpace).build();
admin.createNamespace(namespaceDescriptor);
}
}
这样,在HBase中创建命名空间时,就不会因为命名空间不存在而抛异常了;
当命名空间存在时,直接get调用;当命名空间不存在时,进行create创建。