在C库中以一致的方式处理错误处理错误时,您认为"最佳实践"是什么?
我一直在考虑两种方式:
始终返回错误代码.典型的功能如下所示:
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
Run Code Online (Sandbox Code Playgroud)
始终提供错误指针方法:
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
Run Code Online (Sandbox Code Playgroud)
使用第一种方法时,可以编写这样的代码,其中错误处理检查直接放在函数调用上:
int size;
if(getObjectSize(h, &size) != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
这看起来比错误处理代码更好.
MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为使用返回值返回数据会使代码更具可读性.很明显,在第二个示例中,某些内容被写入了size变量.
您对我为什么应该选择这些方法或者将它们混合或使用其他方法有任何想法吗?我不是全局错误状态的粉丝,因为它往往会使库的多线程使用更加痛苦.
编辑:只要他们不涉及异常,C++关于此的具体想法也会很有趣,因为目前我不能选择...
所以我有一个python脚本,我更喜欢在python 3.2和2.7上工作,只是为了方便.
有没有办法让unicode文字在两者中都有效?例如
#coding: utf-8
whatever = '????'
Run Code Online (Sandbox Code Playgroud)
上面的代码需要python 2.x(u'')中的unicode字符串和python 3.x中的小'u'导致语法错误.
无论如何我找到了答案,我所需要的只是:
#coding: utf-8
whatever = '????'
Run Code Online (Sandbox Code Playgroud)
由于https://meta.stackexchange.com/questions/49922/should-i-continue-adding-a-question-if-i-have-found-the-answer-myself,我仍然在发布这个问题
对于好奇,我正在努力:http://code.google.com/p/pytitle/
对于API,脚本和其他内容来说,它看起来不错.但是使用文本编辑器读取winston json堆栈跟踪非常困难.例如
{"level":"info","message":"starting","timestamp":"2014-05-14T15:45:44.334Z"}
{"date":"Wed May 14 2014 08:45:45 GMT-0700 (Pacific Daylight Time)","process":{"pid":8804,"uid":null,"gid":null,"cwd":"C:\\data\\mytool","execPath":"C:\\Program Files\\nodejs\\node.exe","version":"v0.10.21","argv":["node","C:\\data\\mytool\\server"],"memoryUsage":{"rss":45199360,"heapTotal":32171264,"heapUsed":15158096}},"os":{"loadavg":[0,0,0],"uptime":70496.6138252},"trace":[{"column":null,"file":null,"function":"Object.parse","line":null,"method":"parse","native":true},{"column":32,"file":"C:\\data\\mytool\\src\\status.js","function":"Request._callback","line":166,"method":"_callback","native":false},{"column":22,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"Request.self.callback","line":122,"method":"self.callback","native":false},{"column":17,"file":"events.js","function":"Request.EventEmitter.emit","line":98,"method":"EventEmitter.emit","native":false},{"column":14,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"","line":888,"method":null,"native":false},{"column":20,"file":"events.js","function":"Request.EventEmitter.emit","line":117,"method":"EventEmitter.emit","native":false},{"column":12,"file":"C:\\data\\mytool\\node_modules\\request\\request.js","function":"","line":839,"method":null,"native":false},{"column":20,"file":"events.js","function":"IncomingMessage.EventEmitter.emit","line":117,"method":"EventEmitter.emit","native":false},{"column":16,"file":"_stream_readable.js","function":null,"line":920,"method":null,"native":false},{"column":13,"file":"node.js","function":"process._tickCallback","line":415,"method":"_tickCallback","native":false}],"stack":["SyntaxError: Unexpected end of input"," at Object.parse (native)"," at Request._callback (C:\\data\\mytool\\src\\status.js:166:32)"," at Request.self.callback (C:\\data\\mytool\\node_modules\\request\\request.js:122:22)"," at Request.EventEmitter.emit (events.js:98:17)"," at Request.<anonymous> (C:\\data\\mytool\\node_modules\\request\\request.js:888:14)"," at Request.EventEmitter.emit (events.js:117:20)"," at IncomingMessage.<anonymous> (C:\\data\\mytool\\node_modules\\request\\request.js:839:12)"," at IncomingMessage.EventEmitter.emit (events.js:117:20)"," at _stream_readable.js:920:16"," at process._tickCallback (node.js:415:13)"],"level":"error","message":"uncaughtException: Unexpected end of input","timestamp":"2014-05-14T15:45:45.228Z"}
Run Code Online (Sandbox Code Playgroud) 有时您希望ffmpeg询问您是否应该覆盖文件.有时它只是一个你喜欢的脚本如果出现问题就会失败.即如果你有问题,也不要依赖stdin来回答.
我的应用程序将这个堆栈跟踪发回家,看起来好像发生了什么非常错误.
phone_model = SKY IM-A630K,android_version = 2.1-update1
java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10089 nor current process has android.permission.READ_PHONE_STATE.
at android.os.Parcel.readException(Parcel.java:1218)
at android.os.Parcel.readException(Parcel.java:1206)
at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getLine1Number(IPhoneSubInfo.java:223)
at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:764)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:129)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:108)
at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:91)
at com.emergency.button.EmergencyActivity$EmergencyThread.sendSMS(EmergencyActivity.java:294)
at com.emergency.button.EmergencyActivity$EmergencyThread.sendMessages(EmergencyActivity.java:386)
at com.emergency.button.EmergencyActivity$EmergencyThread.run(EmergencyActivity.java:266)
Run Code Online (Sandbox Code Playgroud)
那么我应该捕获sendTextMessage周围的任何和所有异常吗?这是谁的错?
所以我得到了这个堆栈跟踪:
java.lang.NullPointerException
at android.telephony.SmsMessage$SubmitPdu.<init>(SmsMessage.java:132)
at android.telephony.SmsMessage.getSubmitPdu(SmsMessage.java:551)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:228)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:107)
at com.emergency.button.SMSSender.safeSendSMS(SMSSender.java:91)
at com.emergency.button.EmergencyActivity$EmergencyThread
.sendSMS(EmergencyActivity.java:294)
at com.emergency.button.EmergencyActivity$EmergencyThread
.sendMessages(EmergencyActivity.java:386)
at com.emergency.button.EmergencyActivity$EmergencyThread
.run(EmergencyActivity.java:266)
Run Code Online (Sandbox Code Playgroud)
这就是我调用sendTextMessage的方式,我不验证消息长度或电话号码的有效性:
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
Run Code Online (Sandbox Code Playgroud)
这个错误似乎只发生在HTC Desire或HTC Wildfire与Android 2.2或2.21上,所以我挖出了android平台源码(这实际上并不像我预期的那么容易)并且发现:
SmsMessage.java曾经一度虽然这可能不相关,因为我看到一些行号没有对齐.
该紧急按钮项目是开源的,所以你可以检查出来的代码以供参考.我应该注意到我自己无法测试,我没有手机型号.
我不确定"标量测试"是否正确,但我的意思是测试不是布尔"失败或成功".我正在研究的问题是android的半音调音器:
http://code.google.com/p/androidtuner/
我想通过运行一些wav文件并处理生成的音高图来测试算法.目标是将标量测试结果定义为标准化的x-minus-y平方和,其中x是检测到的音调,y是预期音调.所以一个完美的测试运行将是0,但更现实的是我想调整算法,看看它是否/如何改进所有测试用例.
一般来说 - 单元测试可以导致数字而不是布尔值吗?android测试框架是否允许它?我应该如何与Eclipse集成哪个解决方案?
我目前的想法是绕过一切并使用adb来获取运行每个测试后生成的文件.虽然那不是太棒了.
我希望有一个lambdas列表,它可以作为一些高速计算的缓存,并注意到这一点:
>>> [j() for j in [lambda:i for i in range(10)]]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Run Code Online (Sandbox Code Playgroud)
虽然
>>> list([lambda:i for i in range(10)])
[<function <lambda> at 0xb6f9d1ec>, <function <lambda> at 0xb6f9d22c>, <function <lambda> at 0xb6f9d26c>, <function <lambda> at 0xb6f9d2ac>, <function <lambda> at 0xb6f9d2ec>, <function <lambda> at 0xb6f9d32c>, <function <lambda> at 0xb6f9d36c>, <function <lambda> at 0xb6f9d3ac>, <function <lambda> at 0xb6f9d3ec>, <function <lambda> at 0xb6f9d42c>]
Run Code Online (Sandbox Code Playgroud)
这意味着lambda是唯一的函数,但它们在某种程度上都共享相同的索引值.
这是一个错误还是一个功能?我该如何避免这个问题?它不仅限于列表理解......
>>> funcs = []
... for i in range(10):
... …Run Code Online (Sandbox Code Playgroud) 我想以类似于第二个例子的方式使用imshow进行绘图http://www.scipy.org/Plotting_Tutorial,但重新定义轴的比例.当我这样做时,我也希望图像保持静止!
示例中的代码:
from scipy import *
from pylab import *
# Creating the grid of coordinates x,y
x,y = ogrid[-1.:1.:.01, -1.:1.:.01]
z = 3*y*(3*x**2-y**2)/4 + .5*cos(6*pi * sqrt(x**2 +y**2) + arctan2(x,y))
hold(True)
# Creating image
imshow(z, origin='lower', extent=[-1,1,-1,1])
xlabel('x')
ylabel('y')
title('A spiral !')
# Adding a line plot slicing the z matrix just for fun.
plot(x[:], z[50, :])
show()
Run Code Online (Sandbox Code Playgroud)
如果我将范围修改为更宽,例如:
imshow(z, origin='lower', extent=[-4,4,-1,1])
Run Code Online (Sandbox Code Playgroud)
然后拉伸得到的图像.但我想做的就是改变刻度以与我的数据一致.我知道我可以使用pcolor来保存X和Y数据,尽管这有其他后果.
我发现这个答案允许我手动重做所有刻度:
如何转换(或缩放)轴值并重新定义matplotlib中的滴答频率?
但这似乎有点矫枉过正.
有没有办法只改变标签显示的范围?
python ×4
android ×3
python-3.x ×2
sms ×2
algorithm ×1
c ×1
exec ×1
ffmpeg ×1
interactive ×1
java ×1
json ×1
lambda ×1
locals ×1
matplotlib ×1
node.js ×1
permissions ×1
python-2.x ×1
stdin ×1
testing ×1
unicode ×1
unit-testing ×1
winston ×1