首页 新闻 会员 周边

各位大神,把异常写在日志中会继续执行try中的代码吗

0
悬赏园豆:20 [已解决问题] 解决于 2016-12-27 11:24

把异常写在日志中会继续执行try中的代码吗

兔兔涂涂凸的主页 兔兔涂涂凸 | 初学一级 | 园豆:13
提问于:2016-12-26 18:36
< >
分享
最佳答案
0
            try
            {
                //正常执行
            }
            catch
            {
                //程序异常
            }
            finally
            {
                //无论是否异常都执行这里面的代码
            }

放finaly中。

收获园豆:20
龙行天涯 | 小虾三级 |园豆:1794 | 2016-12-26 19:03

finaly里放批量更新代码??? 还是写判断有多少没更新进去的,再将没更新进去的再更新进去,我是新手,不好意思啦,问问题不太明白。

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-26 19:06

@兔兔涂涂凸:不是在finaly里放批量更新的代码。可能我没明白你的意思。请你把你的需求在详细说明一下,我在帮你分析。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-26 19:10

@程序人生,永无止境: 是这样的,假如我数据库中有100条数据,通过接口获取这些数据中的单号数据,循环这100条数据获得每条数据的单号,然后将这些单号赋值给一个属性,最后一起将这100个单号更新到数据库中,如果其中某条或多条异常了,它前面或后面的非异常的数据还能成功更新到数据库中。

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-26 19:15

@兔兔涂涂凸: 你这里所指的批量,那其实到了从程序里也是通过循环来一条一条更新,这里你也说对了。我明白你的意思,就是说如果有数据出错,那么其他数据还能正常跟新。

            //比如你现在有100条数据
            for (int i = 0; i < 100; i++)
            {
                try
                {
                    // 这里放你要执行更新单条数据的代码,也就是i对应的那条数据
                }
                catch 
                {
                    //如果i这条数据更新失败,则在这里写入日志,并且这样的话不影响下面的数据更新
                
                }
            }

这样就可以了。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-26 19:36

@程序人生,永无止境: 如果我在try里面执行更新单挑数据的代码的话,那有100条数据就是执行100次,也就会对数据库访问100次,现在想的是只访问一次数据库将要更新的数据更新到数据库中去。要是把更新100条数据的代码写在try里,异常了写日志还会返回到try里面执行吗??

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 09:58

@兔兔涂涂凸: 如果把更新100条数据的代码写在try里,那么异常了的话就不会在返回去try里了,而是直接结束整个流程。

我想问一下你更新数据库用的什么方式来更新的,ado.net?还是linq to sql, 用ado.net的话你可以 拼100条sql语句,然后在一次执行,但是这样做的话只能在数据库里去写日志了,而且还要写复杂sql语句,并且你在数据库中写日志也有些东西得不到,比如操作用户。如果是用linq to sql,那么也只能一条条的去修改,因为你要写日志,的一条一条知道到底有没有修改成功。如果你要只请求一次数据库也可以,但是就无法判断你哪些成功哪些失败了,你的日志就不准确了。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-27 10:09

@程序人生,永无止境: 因为如果一条条去修改的话,数据少还可以,数据多的话再一次次去访问数据库就会很慢的,你说一次访问也可以,就是无法判断你哪些成功哪些失败了。我想问一下,你说的一次访问如果有数据出错了也能继续更新数据到数据库吗?

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 10:14

@兔兔涂涂凸: 这种方式只能在某种特定的情况下才能实现。你用的数据库操作方式是什么

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-27 10:23

@程序人生,永无止境: 是ado.net的

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 10:28

@兔兔涂涂凸: ado.net的话可以一次请求,你直接拼100条update 的sql语句,然后在一次提交就行。

update Person set Name='bdf' where Id=2
update Person set Name='dsdfddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd' where Id=5
update Person set Name='yang' where Id=21

你看我代码和图片,我模拟了同时修改3条数据的操作,其中第二天由于长度过大不能成功修改,但是第一条和第三条可以继续执行。

至于你要写日志,就比较麻烦点。1,可以在数据库中给表添加触发器,当数据修改的时候可以根据修改成功与否进行日志写入,但是它无法获取你操作用户。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-27 10:41

@程序人生,永无止境:主要是那个updateall是个封装好的方法,只要前面通过接口获取要的数据,最后把数据给updateall这个方法就能实现批量更新了,不要循环也可以更新,

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 11:09

@兔兔涂涂凸: 那既然你已经有封装好的方法,直接调用就行。但是更新失败的日子就不能保证都对。

用循环的好处就好比,在检票口,需要一个个对乘客的票进行检查,票正确的才能通过,不正确的记录下来;如果不管乘客有没有票都一起让进站台,那你能确保那些乘客有票,哪些乘客没票。逐一检查就行循环一样,可以不漏掉一个不合格的,但是熟读慢些,否则就是速度很快,但是无法确保安全。

既然你已经有封装好的方法,那日志的问题,就在其他地方去实现吧。

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-27 11:19

@程序人生,永无止境: 嗯,准备在获取数据的地方拼sql语句,每条数据对应一条sql更新,最后将这些sql语句一起访问数据库,就这样试试了。 谢谢你了!!!

兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 11:23

@兔兔涂涂凸: 不客气呢

龙行天涯 | 园豆:1794 (小虾三级) | 2016-12-27 11:30
其他回答(5)
0

凭什么不会?凭什么会?

代码呢.结构呢?

吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-26 18:40

try
{
_salesRnRepository.UpdateAll(list.Where(t => t.SenderNO != ""), t => t.ColumnsToUpdate(c => c.SenderNO));
}

catch (Exception ex)
{
HelpMethod.WriteLog(ex);
}

 

 

try里面是批量更新数据,如果其中某条或多条错误,下面的数据怎么继续更新下去

支持(0) 反对(0) 兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-26 18:44
0

_salesRnRepository.UpdateAll(list.Where(t => t.SenderNO != ""), t => t.ColumnsToUpdate(c => c.SenderNO));

看你这个语句,这并不是批量更新。他就是一个update语句: update table set senderno where senderno<>''

批量更新数据,如果其中某条或多条错误,下面的数据怎么继续更新下去:

for(var i=0;i<100;i++){

 try{

update....

}catch(){

}

}

czd890 | 园豆:14312 (专家六级) | 2016-12-26 19:11

 是用update给数据库中某个要更新的列更新数据,已经可以成功将数据更新进去了,现在就是如果其中某条或多条异常了,它前面或后面的非异常的数据怎么样能成功更新到数据库中。谢谢

支持(0) 反对(0) 兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-26 19:17
0

根据你的需求,把try catch写在for循环里面,catch到之后,continue

hahanonym | 园豆:1460 (小虾三级) | 2016-12-26 19:27
0

会继续执行的

ycyzharry | 园豆:25651 (高人七级) | 2016-12-26 19:56
0

UpdateAll 方法一旦报错就会进入catch,就再也不会进入try语句。

所以如果要在某条记录出错后继续执行建议使用for(/for each等)循环。

当然,如果是mysql数据库可以用insert ignore

如果是oracle数据库可以在sql末尾加上LOG ERRORS REJECT LIMIT UNLIMITED

 

CaiYongji | 园豆:1267 (小虾三级) | 2016-12-27 09:58

 要是使用for的话,是不是只能一次更新一条呢

支持(0) 反对(0) 兔兔涂涂凸 | 园豆:13 (初学一级) | 2016-12-27 10:00

@兔兔涂涂凸: 也不绝对。你可以将数据分组执行batch。如果某个分组出错,这组就都标记为有问题重新校验后再插入。

支持(0) 反对(0) CaiYongji | 园豆:1267 (小虾三级) | 2016-12-27 10:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册