我有这个代码:
public static String SelectRandomFromTemplate(String template,int count) {
String[] split = template.split("|");
List<String> list=Arrays.asList(split);
Random r = new Random();
while( list.size() > count ) {
list.remove(r.nextInt(list.size()));
}
return StringUtils.join(list, ", ");
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737): at java.util.AbstractList.remove(AbstractList.java:645)
Run Code Online (Sandbox Code Playgroud)
这怎么会是正确的方法?Java.15
import ftplib
import urllib2
import os
import logging
logger = logging.getLogger('ftpuploader')
hdlr = logging.FileHandler('ftplog.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
FTPADDR = "some ftp address"
def upload_to_ftp(con, filepath):
try:
f = open(filepath,'rb') # file to send
con.storbinary('STOR '+ filepath, f) # Send the file
f.close() # Close file and FTP
logger.info('File successfully uploaded to '+ FTPADDR)
except, e:
logger.error('Failed to upload to ftp: '+ str(e))
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,我得到语法错误,这是什么正确的方法来记录文件的所有类型的异常
多年来,我一直无法得到以下问题的正确答案:为什么一些开发人员如此反对已检查的异常?我有很多对话,在博客上阅读,阅读Bruce Eckel所说的内容(我看到的第一个人反对他们).
我目前正在编写一些新代码,并非常注意我如何处理异常.我试图看到"我们不喜欢被检查的例外"人群的观点,我仍然看不到它.
每次谈话结束时,同样的问题都没有得到答复......让我把它设置起来:
一般来说(从Java的设计方式来看),
我听到的一个常见论点是,如果发生异常,那么开发人员将要做的就是退出该程序.
我听到的另一个常见论点是,经过检查的异常会使重构代码变得更加困难.
对于"我将要做的就是退出"这个论点,我说即使你要退出,你也需要显示一个合理的错误信息.如果您只是在处理错误,那么当程序退出而没有明确说明原因时,您的用户将不会过于高兴.
对于"它很难重构"的人群,这表明没有选择适当的抽象级别.而不是声明方法抛出IOException,IOException应该转换为更适合正在发生的事件的异常.
我没有使用catch(Exception)包装Main的问题(或者在某些情况下catch(Throwable)以确保程序可以正常退出 - 但我总是捕获我需要的特定异常.这样做允许我,至少,显示适当的错误消息.
人们从不回复的问题是:
如果你抛出RuntimeException子类而不是Exception子类,那么你怎么知道你应该捕获什么?
如果答案是捕获异常,那么您也会以与系统异常相同的方式处理程序员错误.这对我来说似乎不对.
如果您捕获Throwable,那么您将以相同的方式处理系统异常和VM错误(等).这对我来说似乎不对.
如果答案是你只捕获你知道的异常,那么你怎么知道抛出的是什么?当程序员X抛出一个新的异常并忘记捕获它时会发生什么?这对我来说似乎非常危险.
我会说显示堆栈跟踪的程序是错误的.那些不喜欢检查异常的人是不是觉得那样?
那么,如果您不喜欢已检查的异常,您可以解释为什么不能并且回答那些无法解答的问题吗?
编辑:我不是在寻找何时使用任何一个模型的建议,我正在寻找的是为什么人们从RuntimeException扩展,因为他们不喜欢从Exception扩展和/或为什么他们捕获异常然后重新抛出RuntimeException而不是将抛出添加到他们的方法中.我想了解不喜欢检查异常的动机.
我一直认为,如果一个方法可以抛出一个异常,那么不顾及用一个有意义的try块来保护这个调用.
我刚刚发布了' 你应该总是包装可以抛出try,catch块的调用.'对这个问题,并被告知这是'非常糟糕的建议' - 我想明白为什么.
我正在将Python异常消息打印到日志文件中logging.error:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
Run Code Online (Sandbox Code Playgroud)
是否可以打印有关异常的更详细信息以及生成它的代码而不仅仅是异常字符串?线号或堆栈跟踪之类的东西会很棒.
有些帖子询问这两者之间的区别是什么.
(为什么我还要提这个...)
但我的问题是不同的,我称之为"抛出前"在另一个错误的神像处理方法.
public class Program {
public static void Main(string[] args) {
try {
// something
} catch (Exception ex) {
HandleException(ex);
}
}
private static void HandleException(Exception ex) {
if (ex is ThreadAbortException) {
// ignore then,
return;
}
if (ex is ArgumentOutOfRangeException) {
// Log then,
throw ex;
}
if (ex is InvalidOperationException) {
// Show message then,
throw ex;
}
// and so on.
}
}
Run Code Online (Sandbox Code Playgroud)
如果try & catch用于Main,那么我会throw; …
我为我的应用程序不期望的每个条件创建了异常. UserNameNotValidException,PasswordNotCorrectException等等.
但是我被告知我不应该为这些条件创建例外.在我的UML中,那些是主流的例外,为什么它不应该是例外?
创建例外的任何指导或最佳实践?
我试图HttpURLConnection在Android中使用HTTP链接来下载文件,但我收到此警告LogCat:
WARN/System.err(223):java.net.SocketException:权限被拒绝(可能缺少INTERNET权限)
我已将android.Manifest.permission添加到我的应用程序中,但它仍然提供相同的异常.
在Python中,我不时会看到块:
try:
try_this(whatever)
except SomeException as exception:
#Handle exception
else:
return something
Run Code Online (Sandbox Code Playgroud)
try-except-else存在的原因是什么?
我不喜欢那种编程,因为它使用异常来执行流控制.但是,如果它包含在语言中,那么必须有充分的理由,不是吗?
我的理解是,异常不是错误,它们只应用于特殊情况(例如我尝试将文件写入磁盘,没有更多空间,或者我没有权限),而不是流程控制.
通常我将异常处理为:
something = some_default_value
try:
something = try_this(whatever)
except SomeException as exception:
#Handle exception
finally:
return something
Run Code Online (Sandbox Code Playgroud)
或者如果我真的不想在发生异常时返回任何内容,那么:
try:
something = try_this(whatever)
return something
except SomeException as exception:
#Handle exception
Run Code Online (Sandbox Code Playgroud) 在C#中,我可以使用该throw;语句在保留堆栈跟踪的同时重新抛出异常:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Run Code Online (Sandbox Code Playgroud)
在Java中有这样的东西(不会丢失原始堆栈跟踪)吗?