小编Pro*_*001的帖子

正确终止程序.使用例外

问题:如果我想要的只是显示错误消息并关闭(假设我可能在程序中很深),是否正确使用异常来终止我的程序?我可以只显式调用exit()这样的东西吗?

我目前在做什么:

我正在开发一个游戏项目,并试图找出在需要执行此类操作的错误的情况下终止程序的最佳方法.例如,在无法加载纹理的情况下,我显示错误消息并终止程序.

我目前正在这样做,例如:

int main()
{
   Game game;
   try
   {
       game.run();
   }
   catch (BadResolutionException & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Resolution");
       return 1;
   }
   catch (BadAssetException & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Assets");
       return 1;
   }
   catch (std::bad_alloc & e)
   {
       Notification::showErrorMessage(e.what(), "ERROR: Memory");
       return 1;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

除了bad_alloc之外的所有内容都是我自己定义的从runtime_error派生的异常.

我不需要任何手动资源清理,我使用std :: unique_ptr进行任何动态分配.我只需要显示错误消息并关闭程序.

研究/替代例外:

我在SO和其他地方查了很多帖子,并且看到其他人说不要使用例外,使用例外,但你使用它们是错误的.我也查找过显式调用exit()之类的东西.

使用exit()听起来不错,但是我看到它不会通过调用堆栈返回主要清理所有内容(如果我能再次找到这个,我会发布链接).此外,根据http://www.cplusplus.com/reference/cstdlib/exit/,如果多个线程处于活动状态,则不应使用此选项.我确实希望在短时间内创建第二个线程至少一次,并且该线程可能会发生错误.

这里有一些关于游戏的回复中提到了不使用例外的问题https://gamedev.stackexchange.com/questions/103285/how-industy-games-handle-their-code-errors-and-exceptions

这里讨论了使用例外情况:http://www.quora.com/Why-do-some-people-recommend-not-using-exception-handling-in-C++

我读过其他一些资料,但那些是我最近看过的资料.

个人结论:

由于我处理错误处理和使用异常的经验有限,我不确定我是否走在正确的轨道上.我根据上面发布的代码选择了使用异常的路线.如果您同意我应该解决这些例外情况,我是否正确使用它?

c++ multithreading exception-handling raii c++11

21
推荐指数
3
解决办法
6098
查看次数

使用内容提供商时重新创建数据库

我的Android应用程序有一个SQLite数据库和一个内容提供程序.此内容提供商已在应用程序中注册AndroidManifest.xml.它不会导出,所以只有我的应用才能看到它.

作为重置用户配置文件的一部分,我想彻底擦除此数据库并从头开始重新创建它.起初我尝试deleteDatabase()从活动的上下文中调用.这有效,但仅在应用程序关闭后重新打开.否则,当我尝试插入表示数据库是只读的行时,它将崩溃.我的理解是在呼叫之前需要先关闭连接deleteDatabase().然而,据我所知,连接由内容提供商管理,不应手动关闭.

作为替代方案,我使用调用自定义函数的call()方法来ContentResolver删除表中的所有数据并手动重置序列计数.

这是有效的,但现在我必须手动删除每个表中的数据,并且必须跟踪我将来做出的任何更改.

是否有更好的方法来删除整个数据库并在使用时使用onCreate()my DatabaseHelper(SQLiteOpenHelper)触发器ContentProvider

sqlite android recreate oncreate android-contentprovider

7
推荐指数
1
解决办法
325
查看次数

UserRecoverableAuthUIException之前的GMail API授权权限

我按照Google的快速启动示例设置了GMail API:https://developers.google.com/gmail/api/quickstart/android

我的应用成功请求GET_ACCOUNTS权限,并允许用户选择他/她的Gmail帐户.所选帐户将保存在SharedPreferences中以供以后访问.

通过IntentService,我的应用程序会发送一封电子邮件.我按照此处的说明操作:https://developers.google.com/gmail/api/guides/sending,并根据需要包含activation.jar,additional.jar和mail.jar库.当我发送带有以下代码的电子邮件时,我得到一个UserRecoverableAuthUIException:

message = service.users().messages().send(userId, message).execute();
Run Code Online (Sandbox Code Playgroud)

当我捕获异常时,获取与异常一起存储的意图,并将意图作为新活动启动,我会看到一个对话框,让我有机会允许我的应用程序使用我的GMail帐户发送电子邮件:

UserRecoverableAuthIOException意图活动

在此对话框上按"允许"后,我的应用程序会发送电子邮件而不会出现任何其他问题.我的应用也会显示在我的Google帐户的在线权限页面上,表示它有权发送电子邮件.

当我第一次获取用户的帐户名而不是等待发生异常时,有没有办法手动触发此对话框?

UPDATE

我已经能够提取存储在intent中的动作和数据,如果这有助于任何:

  • 操作: com.google.android.gms.ui.UNPACKING_REDIRECT
  • 数据:意图://com.google.android.gms.auth.uiflows.common/KEY

其中KEY是一系列字符,可能链接到我的帐户或是一个令牌.

编辑:

以下是创建Credentials对象并启动我正在使用的帐户选择器活动的代码:

private GoogleAccountCredential mCredential;
private static final String[] SCOPES = { GmailScopes.GMAIL_COMPOSE };
Run Code Online (Sandbox Code Playgroud)

内部构造函数:

mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Arrays.asList(SCOPES))
                .setBackOff(new ExponentialBackOff());
Run Code Online (Sandbox Code Playgroud)

我在哪里获得帐户:

private void chooseGMailAccount() {
        String accountName = this.getSharedPreferences(getString(R.string.shared_pref_main),
                Context.MODE_PRIVATE)
                .getString(getString(R.string.srd_pref_gmail_account), null);
        if (accountName != null) {
            mCredential.setSelectedAccountName(accountName);
            configureGMailAPI();
        } else {
            startActivityForResult(
                    mCredential.newChooseAccountIntent(),
                    REQUEST_ACCOUNT_PICKER);
        }
    }
Run Code Online (Sandbox Code Playgroud)

android android-authenticator google-oauth gmail-api android-googleapiclient

7
推荐指数
1
解决办法
987
查看次数

调用Object.getClass()本身是否使用反射?

我的理解是java.lang.Class是“所有反射操作的入口点”。我还了解到,当您实例化一个新对象时,如果这是第一次需要它,它将加载该对象的类。

Something something = new Something() 
Run Code Online (Sandbox Code Playgroud)

调用Object.getClass()(或者在我们的例子中something.getclass())是否使用反射,或者只是类本身内部的方法使用反射?

我认为something.getClass()不使用反射,因为类的引用已被加载,并且 getClass 只是该引用的 getter,但我只是想确定一下。

java reflection class

4
推荐指数
1
解决办法
945
查看次数

androidTest中的Android LiveData返回null

我正在运行androidTest检测测试,我有一个方法,使用Room从DAO对象返回LiveData.

我正在调用这样的方法:

val animal = roomDatabase.animalsDao().getAnimal(1)
animal.observeForever(mMockObserver)
assertNotNull(animal.value)
Run Code Online (Sandbox Code Playgroud)

我用Mockito嘲笑观察者:

@Mock
private lateinit var mMockObserver = Observer<Animal>
Run Code Online (Sandbox Code Playgroud)

这应该返回包含动物ID为1的LiveData实例,但它为null.我的理解是,为了让LiveData返回任何东西,必须有一个观察者.我错误地设置了吗?

注意:如果我在DAO中更改getAnimal()的签名以直接返回Animal,而不是LiveData,那么它可以工作,所以我知道它与LiveData有关.

android kotlin android-room android-livedata android-architecture-components

2
推荐指数
1
解决办法
1411
查看次数

不生成 BuildConfig - Gradle Kotlin DSL

要禁用BuildConfigGroovy DSL 生成,可以执行以下操作:

afterEvaluate {
    generateReleaseBuildConfig.enabled = false
    generateDebugBuildConfig.enabled = false
}
Run Code Online (Sandbox Code Playgroud)

我试图在使用 Gradle 的 Kotlin DSL (build.gradle.kts) 时找到等效项。有人有这样的运气吗?

android android-gradle-plugin android-buildconfig gradle-kotlin-dsl

1
推荐指数
1
解决办法
3625
查看次数