我一直在研究一款try/catch经常使用的Android应用程序,以防止它甚至在没有必要的地方崩溃.例如,
xml layout带有的视图id = toolbar引用如下:
// see new example below, this one is just confusing
// it seems like I am asking about empty try/catch
try {
View view = findViewById(R.id.toolbar);
}
catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
整个应用程序都使用此方法.堆栈跟踪没有打印,很难找到出错的地方.应用程序突然关闭而不打印任何堆栈跟踪.
我让我的大四学生向我解释,他说,
这是为了防止生产中的崩溃.
我完全不同意它.对我而言,这不是阻止应用程序崩溃的方法.它表明开发人员不知道他/她在做什么,并且有疑问.
这是行业中使用的方法,以防止企业应用程序崩溃?
如果try/catch是真的,那么我们真的需要可以附加一个带有UI线程或其他线程的异常处理程序并捕获所有内容吗?如果可能的话,那将是更好的方法.
是的,空try/catch是坏的,即使我们将堆栈跟踪或日志异常打印到服务器,try/catch在所有应用程序中随机包装代码块对我来说没有意义,例如当每个函数都包含在a中时try/catch.
UPDATE
由于这个问题引起了很多关注,有些人误解了这个问题(也许是因为我没有明确表达过),我将把它改写一下.
这是开发人员在这里做的事情
一个函数被编写和测试,它可以是一个小函数,它只是初始化视图或复杂的视图,在测试后它被包裹在try/catch块中.即使是永远不会抛出任何异常的函数.
这种做法在整个申请中使用.有时会打印堆栈跟踪,有时只会出现debug log一些随机错误消息.此错误消息因开发人员而异.
使用这种方法,应用程序不会崩溃,但应用程序的行为变得不确定.甚至有时候很难跟上出错的地方.
我一直在问的真正问题是; 为了防止企业应用程序崩溃,业界是否遵循这种做法?而且我不是在询问空的try/catch.是不是,用户喜欢不会比意外行为的应用程序崩溃的应用程序?因为它真的归结为崩溃或用空白屏幕呈现用户或行为用户不知道.
我在这里发布了一些真实代码的片段
private void …Run Code Online (Sandbox Code Playgroud)您是使用单数还是复数进行枚举?我认为在宣言中使用复数是最合理的
enum Weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Run Code Online (Sandbox Code Playgroud)
...但我认为使用该类型时,单数形式更有意义,例如
Weekday firstDayOfWeek = Weekday.Monday;
Run Code Online (Sandbox Code Playgroud)
我在某个地方读了一个建议,使用单数的常规枚举和带有标志的复数,但我想听到更多的利弊.
是否有在Python中使用异常链的标准方法?像Java引起的'异常'一样?
这是一些背景知识.
我有一个带有一个主要异常类的模块DSError:
class DSError(Exception):
pass
Run Code Online (Sandbox Code Playgroud)
在这个模块的某个地方会有:
try:
v = my_dict[k]
something(v)
except KeyError as e:
raise DSError("no key %s found for %s" % (k, self))
except ValueError as e:
raise DSError("Bad Value %s found for %s" % (v, self))
except DSError as e:
raise DSError("%s raised in %s" % (e, self))
Run Code Online (Sandbox Code Playgroud)
基本上这个片段应该只抛出DSError并告诉我发生了什么以及为什么.问题是try块可能会抛出很多其他异常,所以我更喜欢我能做的事情如下:
try:
v = my_dict[k]
something(v)
except Exception as e:
raise DSError(self, v, e) # Exception chained...
Run Code Online (Sandbox Code Playgroud)
这是标准的pythonic方式吗?我没有在其他模块中看到异常链,那么在Python中如何完成?
如何配置Android Studio(或通常为Intellij)以正确生成带前缀的成员变量的getter和setter?
如果我有课
public class Foo{
int mBar;
}
Run Code Online (Sandbox Code Playgroud)
我希望它创造getBar()而不是getMBar当我做Refactor->Encapsulate或Generate
编辑
我找到了按项目进行的方法:你去吧 File->Settings->Project Settings->Code Style
但它在我的项目目录中的某处创建了一个设置文件.
我想要一个解决方案,允许我为所有项目,现在和将来做一次.
我试图创建一个随机数矩阵,但我的解决方案太长,看起来很难看
random_matrix = [[random.random() for e in range(2)] for e in range(3)]
Run Code Online (Sandbox Code Playgroud)
这看起来不错,但在我的实现中它是
weights_h = [[random.random() for e in range(len(inputs[0]))] for e in range(hiden_neurons)]
Run Code Online (Sandbox Code Playgroud)
这是非常难以理解的,不适合一条线.
假设您有一个菜单项和一个执行相同任务的按钮.为什么将任务的代码放入一个控件的动作事件然后从另一个控件调用该事件是不好的做法?Delphi允许这和vb6一样,但是realbasic没有,并且说你应该将代码放入一个方法,然后由菜单和按钮调用
我在想:他们说如果你手动调用析构函数 - 你做错了什么.但情况总是这样吗?有反例吗?有必要手动调用它或者难以避免的情况/不可能/不切实际的情况吗?
写不好
if (b == false) //...
while (b != true) //...
Run Code Online (Sandbox Code Playgroud)
是不是总是更好,而不是写:
if (!b) //...
while (!b) //...
Run Code Online (Sandbox Code Playgroud)
据推测,性能没有差异(或者存在?),但是如何衡量两者之间的显性,简洁性,清晰度,可读性等?
为了限制主观性,我还要感谢来自权威编码风格指南的任何引用,这些引用始终是优选的,或者在何时使用.
注意:变量名称b仅用作示例,ala foo和bar.
我(可能)不是指"所有其他变量",意思就像var1~.这里一样.我plyr再次指出并调查mlply并想知道为什么参数是用这样的前导点定义的:
function (.data, .fun = NULL, ..., .expand = TRUE, .progress = "none",
.parallel = FALSE)
{
if (is.matrix(.data) & !is.list(.data))
.data <- .matrix_to_df(.data)
f <- splat(.fun)
alply(.data = .data, .margins = 1, .fun = f, ..., .expand = .expand,
.progress = .progress, .parallel = .parallel)
}
<environment: namespace:plyr>
Run Code Online (Sandbox Code Playgroud)
有什么用?这只是个人偏好,命名惯例还是更多?通常R是如此功能,以至于我错过了以前很久以前完成的技巧.
coding-style ×10
java ×3
python ×2
android ×1
boolean ×1
c++ ×1
conventions ×1
delphi ×1
destructor ×1
enumeration ×1
exception ×1
haskell ×1
plyr ×1
python-2.x ×1
r ×1
random ×1
realbasic ×1
try-catch ×1
vb6 ×1