我可以assert抛出我选择的异常而不是AssertionError吗?
更新:
我将解释我的动机:到目前为止,我已经进行了断言式测试,这些测试提出了我自己的例外情况; 例如,当您Node使用某些参数创建对象时,它将检查参数是否适合创建节点,如果不是,则会引发NodeError.
但是我知道Python有一种-o跳过断言的模式,我希望它可用,因为它可以使我的程序更快.但我仍然希望有自己的例外.这就是为什么我想用自己的例外使用assert.
我通过以下方式看到某处断言与消息一起使用:
assert(("message", condition));
Run Code Online (Sandbox Code Playgroud)
这似乎很有效,除了gcc抛出以下警告:
warning: left-hand operand of comma expression has no effect
Run Code Online (Sandbox Code Playgroud)
我怎么能停止警告?
经过多年使用丑陋的MFC ASSERT宏,我终于决定抛弃它并创建最终的ASSERT宏.
我很好地获取文件和行号,甚至是失败的表达式.我可以显示带有这些的消息框,以及中止/重试/取消按钮.
当我按下Retry时,VS调试器会跳转到包含ASSERT调用的行(而不像某些其他ASSERT函数那样反汇编).所以这一切都非常有效.
但真正酷的是显示失败的函数的名称.
然后我可以决定是否调试它而不试图从文件名中猜出它的功能.
例如,如果我有以下功能:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
ASSERT(lpCreateStruct->cx > 0);
...
}
Run Code Online (Sandbox Code Playgroud)
然后当ASSERT触发时,消息框将显示如下内容:
Function = CMainFrame::OnCreate
Run Code Online (Sandbox Code Playgroud)
那么,在运行时找到当前函数名的最简单方法是什么?
它不应该使用MFC或.NET框架,即使我确实使用这两者.
它应该尽可能便携.
我有一个单元测试来检查方法是否返回正确的IEnumerable.该方法使用构建可枚举的yield return.它是可枚举的类如下:
enum TokenType
{
NUMBER,
COMMAND,
ARITHMETIC,
}
internal class Token
{
public TokenType type { get; set; }
public string text { get; set; }
public static bool operator == (Token lh, Token rh) { return (lh.type == rh.type) && (lh.text == rh.text); }
public static bool operator != (Token lh, Token rh) { return !(lh == rh); }
public override int GetHashCode()
{
return text.GetHashCode() % type.GetHashCode();
}
public override bool Equals(object obj) …Run Code Online (Sandbox Code Playgroud) 如何格式化符合PEP8的长断言语句?请忽略我的例子的人为性质.
def afunc(some_param_name):
assert isinstance(some_param_name, SomeClassName), 'some_param_name must be an instance of SomeClassName, silly goose!'
Run Code Online (Sandbox Code Playgroud)
无法将其包装在括号中,因为它会更改assert语句的行为,因为它是关键字,而不是内置函数.
我在基于linux的(arm)通信应用程序中在不可预测的时间遇到以下错误:
pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Run Code Online (Sandbox Code Playgroud)
谷歌出现了很多关于这个错误的引用,但很少有与我的情况相关的信息.我想知道是否有人可以给我一些关于如何解决此错误的想法.有谁知道这个断言的常见原因?
提前致谢.
我刚刚开始浏览John Robbins的"调试MS .Net 2.0应用程序",并且因为他对Debug.Assert(...)的传福音而感到困惑.
他指出,良好实现的Asserts会在某种程度上存储错误状态,例如:
Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");
Run Code Online (Sandbox Code Playgroud)
现在,就个人而言,我似乎很疯狂,他如此喜欢在没有真正明智的"商业逻辑"评论的情况下重述他的测试,也许"因为flobittyjam widgitification过程,我必须永远不会发生i <= 3".
所以,我认为我认为Asserts是一种低级别的"让我保护我的假设"的东西......假设一个人认为这是一个只需要在调试中做的测试 - 即你保护自己不受同事的影响和未来的程序员,并希望他们实际测试的东西.
但是我没有得到的是,他继续说除了正常的错误处理之外你还应该使用断言; 现在我设想的是这样的:
Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我通过Debug.Assert重复错误条件测试获得了什么?如果我们谈论一个非常重要的计算的仅调试双重检查,我想我会得到它...
double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");
Run Code Online (Sandbox Code Playgroud)
...但是我没有得到参数测试,这肯定值得检查(在DEBUG和Release版本中)......或者不是.我错过了什么?
码:-
try {
Assert.assertEquals("1", "2");
} catch (Exception e) {
System.out.println("I am in error block");
}
Run Code Online (Sandbox Code Playgroud)
如果断言语句失败,我想捕获catch块中的错误.我正在尝试上面的代码,它没有发生.
是否会在java异常的catch块中捕获断言错误?
我看过这个问题,但还有几个关于assert关键字用法的问题。我正在与其他一些编码人员讨论如何使用assert. 对于此用例,有一种方法可以在满足某些先决条件时返回 null。我编写的代码调用该方法,然后断言它不返回 null,并继续使用返回的对象。
例子:
class CustomObject {
private Object object;
@Nullable
public Object getObject() {
return (object == null) ? generateObject() : object;
}
}
Run Code Online (Sandbox Code Playgroud)
现在想象我像这样使用它:
public void useObject(CustomObject customObject) {
object = customObject.getObject();
assert object != null;
// Do stuff using object, which would throw a NPE if object is null.
}
Run Code Online (Sandbox Code Playgroud)
有人告诉我应该删除assert,它们不应该用于生产代码,只能用于测试。真的吗?
假设我在python中设置了这样一个类.
from somewhere import sendmail
class MyClass:
def __init__(self, **kargs):
self.sendmail = kwargs.get("sendmail", sendmail) #if we can't find it, use imported def
def publish():
#lots of irrelevant code
#and then
self.sendmail(mail_to, mail_from, subject, body, format= 'html')
Run Code Online (Sandbox Code Playgroud)
所以你可以看到,我有点自己选择参数化我用于self.sendmail的函数
现在在测试文件中.
Class Tester():
kwargs = {"sendmail": MagicMock(mail_from= None, mail_to= None, subject= None, body= None, format= None)}
self.myclass = MyClass(**kwargs)
##later on
def testDefaultEmailHeader():
default_subject = "Hello World"
self.myclass.publish()
self.myclass.sendmail.assert_called() #this is doing just fine
self.myclass.sendmail.assert_called_with(default_subject) #this is having issues
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我收到错误消息
AssertionError: Expected call: …Run Code Online (Sandbox Code Playgroud)