我正在尝试更新DocumentDb / CosmosDb中的某些文档,如果失败,则需要做其他事情,然后如果无法注销...
try {
do a thing w/ database
}
catch (DocumentClientException dce1) {
try {
do another, alternative thing w/ database
}
catch (DocumentClientException dce2) {
log to app insights.
}
}
我不太确定,这似乎很笨拙..你们怎么看?
要获得额外的奖励积分,我需要经常这样做。.这样我可以在某个地方种田的事情会更好;)
答案 0 :(得分:2)
我个人会避免将异常流与功能逻辑流混在一起。它会变脆。而是将异常转换为逻辑标志,并在普通逻辑结构中使用它。
因此,第1步是捕获异常,并基于该异常设置变量或返回值,并将其包装在独立的方法中,以掩盖其他所有人的麻烦:
bool TryDoSomethingWithDataBase()
{
try
{
//Do thing that could fail
return true;
}
catch(SpecificException ex)
{
return false;
}
}
bool TryDoSomethingElseWithDataBase()
{
try
{
//Do thing that could fail
return true;
}
catch(SpecificException ex)
{
return false;
}
}
第2步是照常编写逻辑:
if (!TryDoSomethingWithDatabase())
{
if (!TryDoSomethingElseWithDatabase())
{
LogFatalError();
}
}
或
var ok = TryDoSomethingWithDatabase();
if (ok) return;
ok = TryDoSomethingElseWithDatabase();
if (ok) return;
LogFatalError();
答案 1 :(得分:0)
为什么您对数据库的操作会失败?如果您希望采用不同的逻辑来处理结果,则最好为您知道并期望的条件进行编码,并做不同的事情。
Try catch将捕获所有内容,因此,如果您与数据库的连接失败等,或者您尝试读取或插入格式错误的数据等,则为
Try catch确实有各种例外情况,您可以进一步调查并捕获您感兴趣的特定例外情况。
try
//try something
catch (Exception ex)
{
if (ex is FormatException || ex is OverflowException)
{
//Do something specific;
return;
}
throw;
}
答案 2 :(得分:0)
没关系,但是如果您说了一遍又一遍,最好提取该逻辑并重用它。
一种实现方法是拥有一个将first和section动作作为参数接受的方法,例如:
public void TryThis(Action doFirst, Action doSecond)
{
try {
doFirst();
}
catch (DocumentClientException dce1) {
try {
doSecond();
}
catch (DocumentClientException dce2) {
log to app insights.
}
}
}
然后像这样使用它:
public void DoSomethig1()
{
...
}
public void DoSomething2()
{
...
}
TryThis(DoSomething1, DoSomething2)